#include "koala.h"
#define f0r(i,n) for(int i = 0; i < n; i++)
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) cout<<#v<<": "; for(auto u : v)cout<<u<<' '; cout<<endl
#include<bits/stdc++.h>
using namespace std;
int minValue(int N, int W) {
// TODO: Implement Subtask 1 solution here.
// You may leave this function unmodified if you are not attempting this
// subtask.
int round[N];
round[0] = 1;
for(int i = 1;i<N;i++)round[i] = 0;
int ret[N];
playRound(round, ret);
bool isfirst = 1;
int zero = 0;
for(int i = 0;i<N;i++){
if(ret[i] == 2){
isfirst = 0;
}
if(ret[i] == 0)zero = i;
}
if(isfirst)return 0;
else return zero;
}
int maxValue(int N, int W) {
int poss = N;
vector<bool>can(N, true);
while(poss > 1){
int num = W/poss;
int quer[N];
for(int i = 0;i<N;i++){
if(can[i])quer[i] = num;
else quer[i] = 0;
}
int ret[N];
playRound(quer, ret);
for(int i = 0;i<N;i++){
if(ret[i] == 0 && can[i])can[i] = 0;
}
poss = 0;
for(int i = 0;i<N;i++){
if(can[i])poss++;
}
}
int ans = 0;
for(int i = 0;i<N;i++){
if(can[i])ans = i;
}
return ans;
}
int greaterValue(int N, int W) {
// TODO: Implement Subtask 3 solution here.
// You may leave this function unmodified if you are not attempting this
// subtask.
int quer[N];
quer[0] = 5;
quer[1] = 5;
for(int i = 2;i<N;i++)quer[i] = 0;
int ret[N];
playRound(quer, ret);
if(ret[0] == 0 && ret[1] != 0)return 1;
else if(ret[0] != 0 && ret[1] == 0)return 0;
else{
if(ret[0] == 0){
quer[0] = 2;
quer[1] = 2;
playRound(quer, ret);
if(ret[0] == 0 && ret[1] != 0)return 1;
else if(ret[0] != 0 && ret[1] == 0)return 0;
else{
if(ret[0] == 0){
quer[0] = 1;
quer[1] = 1;
playRound(quer, ret);
if(ret[0] == 0 && ret[1] != 0)return 1;
else return 0;
}
else{
quer[0] = 3;
quer[1] = 3;
playRound(quer, ret);
if(ret[0] == 0 && ret[1] != 0)return 1;
else return 0;
}
}
}
else{
quer[0] = 8;
quer[1] = 8;
playRound(quer, ret);
if(ret[0] == 0 && ret[1] != 0)return 1;
else return 0;
}
}
return 0;
}
void allValues(int N, int W, int *P) {
if (W == 2*N) {
// TODO: Implement Subtask 4 solution here.
// You may leave this block unmodified if you are not attempting this
// subtask.
set<int>s; for(int i = 0; i < N; i++)s.insert(i); int quer[N], ret[N]; int qrs = 0;
for(int tt = N; tt >= 2; tt--){
vector<bool>can(N); for(auto u : s)can[u] = 1;
while(1){ //dout(tt);
int cnt = 0; f0r(i,N)if(can[i])cnt++; if(cnt <= 1){break;}
int L = tt - cnt + 1, R = tt; //dout2(L,R);
int mx = 1e9, mxd = 0; for(int num = 2; num <= 101; num++)if((R - L + 1) * (num-1) <= W){
int ptr = L-1, good = 0, cur = tt + 100, p2 = R; while(cur > 0){
if(cur < num){
break;
}
if(p2 < L)break;
int ct1 = 0, pt = 0; for(int i = ptr; i > max({0, ptr - num, ptr - cur}); i--){
ct1 += i; pt++;
}
int ct2 = p2;
if(ct2 > ct1){
good++, p2--; cur -= num;
}
else{
cur--; ptr--;
}
} //dout2(num,good);
if(good > 0 && good < mx)mx = good, mxd = num;
}
int d = mxd; //if(tt==10)dout(d);
f0r(i,N)quer[i]=0; f0r(i,N)if(can[i])quer[i]=d-1; playRound(quer,ret); //vout(quer); vout(ret);
f0r(i,N)if(can[i] && ret[i] <= quer[i])can[i]=0;
}
f0r(i,N)if(can[i])s.erase(i), P[i] = tt;
}
P[*s.begin()] = 1;
} else {
// TODO: Implement Subtask 5 solution here.
// You may leave this block unmodified if you are not attempting this
// subtask.
set<int>s; for(int i = 0; i < N; i++)s.insert(i); int quer[N], ret[N]; int qrs = 0;
for(int tt = N; tt >= 2; tt--){
vector<bool>can(N); for(auto u : s)can[u] = 1;
while(1){ //dout(tt);
int cnt = 0; f0r(i,N)if(can[i])cnt++; if(cnt <= 1){break;}
int L = tt - cnt + 1, R = tt; //dout2(L,R);
int mx = 1e9, mxd = 0; for(int num = 2; num <= 51; num++)if((R - L + 1) * (num-1) <= W){
int ptr = L-1, good = 0, cur = tt, p2 = R; while(cur > 0){
if(cur < num){
break;
}
if(p2 < L)break;
int ct1 = 0, pt = 0; for(int i = ptr; i > max({0, ptr - num, ptr - cur}); i--){
ct1 += i; pt++;
}
int ct2 = p2;
if(ct2 > ct1){
good++, p2--; cur -= num;
}
else{
cur--; ptr--;
}
} //dout2(num,good);
if(good > 0 && good < mx)mx = good, mxd = num;
}
int d = mxd; //if(tt==10)dout(d);
f0r(i,N)quer[i]=0; f0r(i,N)if(can[i])quer[i]=d-1; playRound(quer,ret); //vout(quer); vout(ret);
f0r(i,N)if(can[i] && ret[i] <= quer[i])can[i]=0;
}
f0r(i,N)if(can[i])s.erase(i), P[i] = tt;
}
P[*s.begin()] = 1;
}
}