//g++ swaps_sample.cpp sample_grader.cpp
#include "swaps.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define mk make_pair
#define pb push_back
#define fr first
#define sc second
vector<vi> merge(vector<vi> a) {
if(a.empty()) return a;
// a funcao merge acha a ordem de todo mundo
// primeiro, dividimos cada array em 2 e chamamos a recorrencia
vector<vi> b;
for(auto v : a) {
if(sz(v) == 1) continue;
vi x, y;
for(int i = 0; 2*i < sz(v); i++) x.pb(v[i]);
for(int i = sz(v)-1; 2*i >= sz(v); i--) y.pb(v[i]);
b.pb(x);
b.pb(y);
}
b = merge(b);
for(int i = 0, j = 0; i < sz(a); i++) {
if(sz(a[i]) == 1) continue;
vi x = b[2*j], y = b[2*j+1];
for(int k = 0; k < sz(x); k++)
schedule(x[k], y[sz(y)-1-k]);
j++;
}
vi rsp = visit();
for(int i = 0, j = 0, cnt = 0; i < sz(a); i++) {
if(sz(a[i]) == 1) continue;
for(int k = 0; k < sz(b[2*j]); k++) {
if(rsp[cnt] == 0) swap(b[2*j][k], b[2*j+1][sz(b[2*j+1])-1-k]);
cnt++;
}
j++;
}
b = merge(b);
for(int i = 0, j = 0; i < sz(a); i++) {
if(sz(a[i]) == 1) continue;
a[i].clear();
for(auto it : b[2*j]) a[i].pb(it);
for(auto it : b[2*j+1]) a[i].pb(it);
j++;
}
return a;
}
void solve(int N, int V) {
vector<vi> v(1);
for(int i = 1; i <= N; i++) v[0].pb(i);
answer(merge(v)[0]);
}