| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1277944 | cmiuc | Unscrambling a Messy Bug (IOI16_messy) | C++20 | 0 ms | 0 KiB | 
#include <iostream>
#include <vector>
#include "messy.h"
using namespace std;
vector<int> Ans, vc;
void compile_set(){
}
bool check_element(string s){
	return st.find(s) != st.end();
}
void Write(int n, int l, int r, string s){
	if (n == 0)
		return;
	for (int i=l;i<l + n;i++){
		s[i] = '1';
		add_element(s);
		s[i] = '0';
	}
	string s1 = s, s2 = s;
	for (int i=l;i<l + n;i++){
		s1[i + n] = '1';
		s2[i] = '1';
	}
	Write(n / 2, l, l + n, s1);
	Write(n / 2, l + n, r, s2);
}
void Read(int n, int l, int r, string s, vector<int> pos){
	if (n == 1 or n == 0){
		Ans[l] = pos[0];
		return;
	}
	vector<int> v1, v2;
	string s1 = s, s2 = s;
	for (int i=0;i<n;i++){
		s[pos[i]] = '1';
		if (check_element(s))
			v1.push_back(pos[i]);
		else
			v2.push_back(pos[i]);
		s[pos[i]] = '0';
	}
	for (int i : v1)
		s2[i] = '1';
	for (int i : v2)
		s1[i] = '1';
	n /= 2;
	Read(n, l, l + n, s1, v1);
	Read(n, l + n, r, s2, v2);
}
vector<int> restore_permutation(int n, int w, int r){
	Ans.resize(n);
	string s;
	for (int i=0;i<n;i++)
		vc.push_back(i), s += '0';
	Write(n / 2, 0, n, s);
	compile_set();
	Read(n, 0, n, s, vc);
	return Ans;
}
