#include "advisor.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const int MaxN = 2e5+7;
int col[MaxN],nxt[MaxN],lst[MaxN],Log;
bool UA[MaxN];
struct cmp {
bool operator()(int a, int b) {
return nxt[a] < nxt[b];
}
};
priority_queue<int,vector<int>,cmp> pq;
void ComputeAdvice(int *C, int N, int K, int M) {
for (int i=0;i<K;i++) col[i] = i;
for (int i=0;i<N;i++) col[i + K] = C[i];
Log = 0;
while ((1LL<<Log) < N) Log++;
for (int i=0;i<N;i++) lst[i] = INF;
for (int i=N+K-1;i>=0;i--) {
nxt[i] = lst[col[i]];
lst[col[i]] = i;
}
set<int> s;
for (int i=0;i<N+K;i++) {
if (s.find(col[i]) == s.end()) {
if (s.size() >= K) {
while (!pq.empty() && lst[col[pq.top()]] != pq.top()) pq.pop();
s.erase(col[pq.top()]);
pq.pop();
}
s.insert(col[i]);
}
else {
UA[lst[col[i]]] = true;
}
pq.push(i);
lst[col[i]] = i;
}
for (int i=0;i<N+K;i++) WriteAdvice(UA[i]);
}
#include "assistant.h"
#include <bits/stdc++.h>
using namespace std;
const int MaxN = 2e5+7;
int LOG,C[MaxN];
bool ua[MaxN];
void Assist(unsigned char *A, int N, int K, int R) {
LOG = 0;
while ((1LL<<LOG) < N) LOG++;
for (int i=0;i<N + K;i++) {
ua[i] = A[i];
}
set<int> s1,s2;
for (int i=0;i<K;i++) {
if (ua[i]) s1.insert(i);
else s2.insert(i);
}
for (int i=0;i<N;i++) {
int tmp = GetRequest();
if (s1.find(tmp) == s1.end() && s2.find(C[i]) == s2.end()) {
PutBack(*(s2.begin()));
s2.erase(s2.begin());
}
if (ua[i+K]) s1.insert(tmp);
else s2.insert(tmp);
}
return;
}