#include "advisor.h"
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn = 1e5 + 10, maxk = 25005;
int n, k, m;
vector < int > uses[maxn];
int nxt[maxn];
int on_pos[maxn];
void ComputeAdvice(int *C, int N, int K, int M)
{
    n = N;
    k = K;
    m = M;
    int lg = 0, stepen = 1;
    while(stepen*2 <= k)
    {
        stepen *= 2;
        lg ++;
    }
    for (int i = 0; i < n; ++ i)
    {
        uses[i].pb(1e9);
        nxt[i] = 1e9;
    }
    for (int i = n-1; i >= 0; -- i)
    {
        uses[C[i]].pb(i);
        nxt[C[i]] = i;
    }
    set < pair < int, int > > s;
    for (int i = 0; i < n; ++ i)
        on_pos[i] = -1;
    for (int i = 0; i < k; ++ i)
    {
        s.insert(make_pair(nxt[i], i));
        on_pos[i] = i;
    }
    for (int i = 0; i < n; ++ i)
    {
        //cout << "i = " << i << endl;
        if(on_pos[C[i]] != -1)
        {
            uses[C[i]].pop_back();
            continue;
        }
        pair < int, int > worst = *s.rbegin();
        //cout << "here " << endl;
        int t = worst.second;
       // cout << t << endl;
        int pos = on_pos[t];
        on_pos[t] = -1;
        on_pos[C[i]] = pos;
       // cout << pos << endl;
        for (int bit = 0; bit <= lg; ++ bit)
        {
            if((1<< bit) & pos)WriteAdvice(1);
            else WriteAdvice(0);
        }
        uses[C[i]].pop_back();
        nxt[C[i]] = uses[C[i]].back();
        s.erase(s.find(worst));
        s.insert(make_pair(nxt[C[i]], C[i]));
    }
    return;
}
#include "assistant.h"
#include <bits/stdc++.h>
using namespace std;
int taken[200000], active[200000];
void Assist(unsigned char *A, int N, int K, int R)
{
    int n, k;
    n = N;
    k = K;
    int lg = 0, stepen = 1;
    while(stepen*2 <= k)
    {
        stepen *= 2;
        lg ++;
    }
    for (int i = 0; i < k; ++ i)
    {
        taken[i] = i;
        active[i] = 1;
    }
  int i;
  int j = 0;
  for (i = 0; i < n; i++)
    {
    int req = GetRequest();
    if (active[req])continue;
    int up = 0;
    for (int bit = 0; bit <= lg; ++ bit)
    {
        if(A[j] == '1')
        {
            up += (1 << bit);
        }
        j ++;
    }
    active[taken[up]] = 0;
    PutBack(taken[up]);
    taken[up] = req;
    active[req] = 1;
  }
    return;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |