| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1170205 | Zbyszek99 | Two Antennas (JOI19_antennas) | C++20 | 0 ms | 0 KiB | 
#include "minerals.h"
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define ff first
#define ss second
#define vi vector<int>
#define vl vector<long long>
#define pii pair<int,int>
#define pll pair<long long, long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace std;
//mt19937 mt;void random(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll rand(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
bool is_on[86001];
map<int,int> rel_poz;
int ask(int x)
{
    //cout << x << " x\n";
    if(is_on[x]) is_on[x] = 0;
    else is_on[x] = 1;
    return Query(rel_poz[x]);
}
pii seg[86001];
int cur_pref[86001];
void Solve(int n) 
{
    int cur_dif = 0;
    int cur = 1;
    int cur2 = n+1;
    rep2(i,1,n*2)
    {
        int nd = Query(i);
        if(nd == cur_dif)
        {
            rel_poz[cur2] = i;
            cur2++;
        }
        else
        {
            rel_poz[cur] = i;
            cur++;
            cur_dif = nd;
        }
    }
    rep2(i,1,n*2) Query(i);
    rep2(i,1,n)
    {
        seg[i] = {n+1,2*n};
    }
    int ans_count = 0;
    rep2(i,n+1,(3*n+1)/2)
    {
        cur_dif = ask(i);
    }
    vector<pii> prefs = {{n+1,n*2}};
    rep2(i,1,n)
    {
        cur_pref[i] = 0;
    }
    while(ans_count != n)
    {
        ans_count = 0;
        rep2(i,1,n)
        {
            if(seg[i].ff != seg[i].ss)
            {
                int new_dif = ask(i);
                int mid = (prefs[cur_pref[i]].ff + prefs[cur_pref[i]].ss)/2;
                if(is_on[i])
                {
                    if(new_dif > cur_dif)
                    {
                        seg[i].ff = mid+1;
                    }
                    else
                    {
                        seg[i].ss = mid;
                    }
                }
                else
                {
                    if(new_dif < cur_dif)
                    {
                        seg[i].ff = mid+1;
                    }
                    else
                    {
                        seg[i].ss = mid;
                    }
                }
           //     ask(i);
            }
            else
            {
                ans_count++;
            }
        }
        vector<pii> new_pref;
        forall(it,prefs)
        {
            if(it.ff == it.ss) continue;
            int mid = (it.ff+it.ss)/2;
            rep2(i,(it.ff+mid)/2+1,mid)
            {
                cur_dif = ask(i);
            }
            rep2(i,mid+1,(mid+1+it.ss)/2)
            {
                cur_dif = ask(i);
            }
            new_pref.pb({it.ff,mid});
            new_pref.pb({mid+1,it.ss});
        }
        prefs = new_pref;
        vector<pii> vsort;
        rep2(i,1,n)
        {
            if(seg[i].ff != seg[i].ss)
            {
                vsort.pb({seg[i].ff,i});
            }
        }
        sort(all(vsort));
        int cur_p = 0;
        forall(it,vsort)
        {
            while(prefs[cur_p].ff != seg[it.ss].ff)
            {
                cur_p++;
            }
            cur_pref[it.ss] = cur_p;
        }
    }
    rep2(i,1,n)
    {
     //   cerr << rel_poz[i] << " " << rel_poz[seg[i].ff] << " seg\n";
        Answer(rel_poz[i],rel_poz[seg[i].ff]);
    }    
}
