#include <bits/stdc++.h>
using namespace std;
void add_element(std::string x);
bool check_element(std::string x);
void compile_set();
string s;
void Write(int l,int r)
{
    if(l==r)return;
    int m=(l+r)/2;
    for(int i=l;i<=m;i++)
    {
        s[i]='1';
        add_element(s);
        s[i]='0';
    }
    for(int i=m+1;i<=r;i++)s[i]='1';
    Write(l,m);
    for(int i=m+1;i<=r;i++)s[i]='0';
    for(int i=l;i<=m;i++)s[i]='1';
    Write(m+1,r);
    for(int i=l;i<=m;i++)s[i]='0';
}
vector<int> p;
void Read(int l,int r,vector<int> ind)
{
    if(l==r)
    {
        p[ind[0]]=l;
        return;
    }
    // bits [l,r] in original string correspond to bits ind in the shuffled one
    int m=(l+r)/2;
    vector<int> lt,rt;
    for(int i:ind)
    {
        s[i]='1';
        if(check_element(s))
        {
            lt.push_back(i);
        }
        else
        {
            rt.push_back(i);
        }
        s[i]='0';
    }
    for(auto i:rt)s[i]='1';
    Read(l,m,lt);
    for(auto i:rt)s[i]='0';
    for(auto i:lt)s[i]='1';
    Read(m+1,r,rt);
    for(auto i:lt)s[i]='0';
}
std::vector<int> restore_permutation(int n, int w, int r)
{
    s.clear();
    p.clear();
    vector<int> q;
    for(int i=0;i<n;i++)s+='0',q.push_back(i),p.push_back(0);
    Write(0,n-1);
    for(int i=0;i<n;i++)s[i]='0';
    compile_set();
    Read(0,n-1,q);
    return p;
}
Compilation message (stderr)
messy.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
messy_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~| # | 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... |