#include <iostream>
#include <vector>
#include "code.h"

using namespace std;

vector<pair<int, int>> ZapisiTacke(int N){
    vector<pair<int, int>> tacke(N+1);
    tacke[1]={0,0};
    for(int i=2;i<=N;i++){
        tacke[i]={i,1};
    }
    return tacke;
}

int NadjiKec(int N)
{
    if(Pitaj(1,2,3)!=0){
        if(Pitaj(2,3,4)==0)return 1;
        if(Pitaj(1,3,4)==0)return 2;
        return 3;
    }
    for(int i=4;i<=N;i++){
        if(Pitaj(1,2,i)!=0)return i;
    }
    return N;
}

void rekres(vector<int>&res, vector<int>& ind, int& prvi, int offset)
{
    vector<int>levi;
    vector<int>desni;
    int cntL=0;
    int x = ind[0];
    for(int i=1;i<ind.size();i++){
        if(Pitaj(prvi,x,ind[i])==1){
            levi.push_back(ind[i]);
            cntL++;
        }
        else desni.push_back(ind[i]);
    }
    //cerr<<"Gledamo od prvog na polju "<<prvi<<" do drugog "<<x<<'\n';
    //for(auto i:levi)cerr<<i<<' ';cerr<<endl;
    //for(auto i:desni)cerr<<i<<' ';cerr<<endl;
    //cerr<<offset+cntL<<" nalazi na "<<x<<'\n';
    res[x]=offset+cntL;
    if(levi.size()>0)rekres(res,levi,prvi,offset);
    if(desni.size()>0)rekres(res,desni,prvi,offset+cntL+1);
}

vector<int> Resi(int N, int Q){
    vector<int> resenje(N+1);
    if(N<=200&&Q==20000){
        int x=Pitaj(1,2,3);
        if(x==0)
            for(int i=1;i<=N;i++)resenje[i]=N-i+1;
        else for(int i=1;i<=N;i++)resenje[i]=i;
        return resenje;
    }
    int prvi = NadjiKec(N);
    resenje[prvi]=1;
    //cerr<<"KEC = "<<prvi<<'\n';
    vector<int>ind;
    for(int i=1;i<=N;i++){
        if(i==prvi)continue;
        ind.push_back(i);
    }
    //cerr<<"Indeksi ";
    //for(auto i:ind)cerr<<i;cerr<<endl;
    rekres(resenje, ind, prvi, 2);
    return resenje;
}