#include"advisor.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const int INF=1e9;
pair<int,int> seg[MAXN*4];
int nex[MAXN],pos[MAXN],F[MAXN];
void build(int l,int r,int pos)
{
if(l==r)
{
seg[pos]={-1,l};
return ;
}
int mid=(l+r)/2;
build(l,mid,pos*2);
build(mid+1,r,pos*2+1);
seg[pos]=max(seg[pos*2],seg[pos*2+1]);
}
void update(int l,int r,int i,int val,int pos)
{
if(i<l||r<i) return ;
if(l==r)
{
seg[pos]={val,l};
return ;
}
int mid=(l+r)/2;
update(l,mid,i,val,pos*2);
update(mid+1,r,i,val,pos*2+1);
seg[pos]=max(seg[pos*2],seg[pos*2+1]);
}
int get(int l,int r,int i,int pos)
{
if(l==r) return seg[pos].first;
int mid=(l+r)/2;
if(i<=mid) return get(l,mid,i,pos*2);
return get(mid+1,r,i,pos*2+1);
}
void ComputeAdvice(int *C,int N,int K,int M)
{
for(int i=0;i<N;i++) pos[i]=N,F[i]=i-N;
for(int i=N-1;i+1;i--) nex[i]=pos[C[i]],pos[C[i]]=i;
build(0,N-1,1);
for(int i=0;i<K;i++) update(0,N-1,i,pos[i],1);
string s;
for(int i=0;i<N*2;i++) s+='0';
for(int i=0;i<N;i++)
{
if(get(0,N-1,C[i],1)==-1)
{
int res=seg[1].second;
s[F[res]+N]='1';
update(0,N-1,res,-1,1);
}
update(0,N-1,C[i],nex[i],1);
F[C[i]]=i;
}
for(int i=0;i<N*2;i++) WriteAdvice(s[i]-'0');
}
#include"assistant.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
bool ck[MAXN];
stack<int> st;
void Assist(unsigned char *A,int N,int K,int R)
{
for(int i=0;i<N;i++) if(int(A[i])) st.push(i);
for(int i=0;i<K;i++) ck[i]=true;
for(int i=0;i<N;i++)
{
int res=GetRequest();
if(!ck[res])
{
PutBack(st.top());
ck[st.top()]=false,st.pop();
}
ck[res]=true;
if(int(A[i+N])) st.push(res);
}
}