This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>
#include <functional>
#include <set>
#include <map>
#include <bitset>
#include <bit>
#include <string>
#include "messy.h"
using namespace std;
typedef long long int ll;
typedef vector<ll> vll;
typedef set<ll> sll;
typedef vector<vll> vvll;
typedef bitset<128> bits;
typedef vector<bits> vbits;
typedef set<bits> sbits;
typedef vector<bool> vb;
typedef pair<bits, bool> pbits_b;
typedef vector<pbits_b> vpbits_b;
const ll TWO[8] = {1, 2, 4, 8, 16, 32, 64, 128};
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define sz(a) (ll) a.size()
#define mp(a, b) make_pair(a, b)
#define pb(a) push_back(a)
#define trav(i, a, t) for (t::iterator i = a.begin(); i != a.end(); i++)
ll n, w, r;
ll b;
void add_elements(ll l, ll r) {
    if (l == r) return;
    // add elements with all outside [l, r] 1s, and first half of [l, r] containing one 1
    string s;
    rep(i, 0, l) s += '1';
    rep(i, l, r + 1) s += '0';
    rep(i, r + 1, n) s += '1';
    ll m = (l + r) / 2;
    rep(i, l, m + 1) {
        s[i] = '1';
        //cout << "added: " << s << endl;
        add_element(s);
        s[i] = '0';
    }
    add_elements(l, m);
    add_elements(m + 1, r);
}
vvll p;
std::vector<int> p_answ;
void check_elements(ll d, ll l, ll r, string& s) {
    if (l == r) {
        p_answ[p[d][l]] = l;
        return;
    }
    //cout << "check_elements(" << d << ", " << l << ", " << r << ") s: " << s << endl;
    // check how elements created by add_elements(l, r) have been displaced
    // the passed in string contains 1's where elements [0, l)U(r, n - 1] have been displaced
    // p[l:r] contains the set of indices to which [l, r] is displaced
    ll m = (l + r) / 2;
    // here we find p[l:m] and p[m+1:r]
    vll lm;
    vll mr;
    rep(i, l, r + 1) {
        s[p[d][i]] = '1';
        //cout << "check_element: " << s << " -> ";
        if (check_element(s)) {
            //cout << "true" << endl;
            lm.pb(p[d][i]);
        } else {
            //cout << "false" << endl;
            mr.pb(p[d][i]);
        }
        s[p[d][i]] = '0';
    }
    /* cout << "lm " << sz(lm) << " & mr " << sz(mr) << " s: " << s << endl;
    cout << "lm: ";
    trav(itr, lm, vll) {
        cout << *itr <<  " ";
    }
    cout << endl;
    cout << "mr: ";
    trav(itr, mr, vll) {
        cout << *itr << " ";
    }
    cout << endl; */
    rep(i, l, m + 1) {
        p[d + 1][i] = lm[i - l];
    }
    rep(i, m + 1, r + 1) {
        p[d + 1][i] = mr[i - (m + 1)];
    }
    // iterate downward
    rep(i, m + 1, r + 1) s[p[d + 1][i]] = '1';
    check_elements(d + 1, l, m, s);
    rep(i, m + 1, r + 1) s[p[d + 1][i]] = '0';
    rep(i, l, m + 1) s[p[d + 1][i]] = '1';
    check_elements(d + 1, m + 1, r, s);
    rep(i, l, m + 1) s[p[d + 1][i]] = '0';
}
std::vector<int> restore_permutation(int n_, int w_, int r_) {
    n = n_; w = w_; r = r_;
    // determine b
    b = 0; while (n ^ TWO[b]) b++;
    //cout << "add_elements" << endl;
    add_elements(0, n - 1);
    //cout << "compile_set" << endl;
    compile_set();
    //cout << "setup check_elements" << endl;
    p_answ.resize(n);
    p.resize(b + 1);
    rep(i, 0, b + 1) p[i].resize(n);
    rep(i, 0, n) p[0][i] = i;
    string s;
    rep(i, 0, n) s += "0";
    //cout << "check_elements" << endl;
    check_elements(0, 0, n - 1, s);
    return p_answ;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |