#include <iostream>
#include <vector>
#include "koala.h"
using namespace std;
int minValue(int N, int W) {
int B[100],R[100];
for(int i=0;i<N;i++)B[i]=0;
B[0]=1;
playRound(B,R);
for(int i=0;i<N;i++){
if(R[i]==0)return i;
}
}
int maxValue(int N, int W) {
int B[100],R[100];
vector<int> v;
for(int i=0;i<N;i++)v.push_back(i);
while(v.size()>1){
for(int i=0;i<N;i++)B[i]=0;
for(int i:v)B[i]=min(13,int(100/v.size()));
vector<int> t;
for(int i=0;i<N;i++){
if(B[i]>0&&R[i]>B[i])t.push_back(i);
}
v=t;
}
return v[0];
}
int greaterValue(int N, int W) {
int B[100],R[100];
for(int i=0;i<N;i++)B[i]=0;
B[0]=1;B[1]=1;
playRound(B,R);
while(!((R[0]>1&&R[1]<2)||(R[0]<2&&R[1])>1)){
for(int i=2;i<N;i++)B[i]=R[i];
playRound(B,R);
}
if(R[1]>R[0])return 1;
return 0;
}
bool greaterV(int N, int W) {
int B[100],R[100];
for(int i=0;i<N;i++)B[i]=0;
B[0]=1;B[1]=1;
playRound(B,R);
while(!((R[0]>1&&R[1]<2)||(R[0]<2&&R[1])>1)){
for(int i=2;i<N;i++)B[i]=R[i];
playRound(B,R);
}
if(R[1]>R[0])return 1;
return 0;
}
bool great(int i,int j){
int B[100],R[100];
for(int t=0;t<100;t++)B[t]=0;
B[i]=100;B[j]=100;
playRound(B,R);
if(R[j]==101)return true;
return false;
}
void sort1(vector<int> &v,int b,int e){
if(e-b==1)return;
int mid=(e+b)/2;
vector<int> tmp(e-b);
sort1(v,b,mid);sort1(v,mid,e);
int i=b,j=mid;
for(int t=0;t<e-b;t++){
if(j==e||(i<mid&&great(i,j))){
tmp[t]=v[i];
i++;
}else{
tmp[t]=v[j];
j++;
}
}
for(int i=0;i<e-b;i++)v[i+b]=tmp[i];
}
int maxValue2(int N, int W,vector<int> &v) {
int B[100],R[100];
while(v.size()>1){
for(int i=0;i<N;i++)B[i]=0;
for(int i:v)B[i]=min(14,int(100/v.size()));
playRound(B,R);
vector<int> t;
for(int i=0;i<N;i++){
if(B[i]>0&&R[i]>B[i])t.push_back(i);
}
v=t;
}
return v[0];
}
void allValues(int N, int W, int *P) {
if (W == 2*N) {
vector<int> v(N);
for(int i=0;i<N;i++)v[i]=i;
sort1(v,0,N);
for(int i=0;i<N;i++)P[v[i]]=i+1;
} else {
for(int i=0;i<N;i++)P[i]=0;
for(int t=N;t>0;t--){
vector<int> v;
for(int i=0;i<N;i++){
if(P[i]==0)v.push_back(i);
}
int i=maxValue2(N,W,v);
P[i]=t;
}
}
}