#include "minerals.h"
#include<iostream>
#include<stack>
#include<map>
#include<vector>
#include<string>
#include<cassert>
#include<unordered_map>
#include <queue>
#include <cstdint>
#include<cstring>
#include<limits.h>
#include<cmath>
#include<set>
#include<algorithm>
#include <iomanip>
#include<numeric>
#include<bitset>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
const ll inf=1e9,mxn=1e5;
/*
dnc + parallel bsearch?
*/
int done[mxn+10],ans[mxn+10];
pii bound[mxn+10];
int cl,cr,cs=0;
void move(int l,int r){
  if(l>=cr){
    while(cr<r)cs=Query(++cr);
    while(cr>r)cs=Query(cr--);
    while(cl<l)cs=Query(cl++);
    while(cl>l)cs=Query(--cl);
    return;
  }
  while(cl<l)cs=Query(cl++);
  while(cl>l)cs=Query(--cl);
  while(cr<r)cs=Query(++cr);
  while(cr>r)cs=Query(cr--);
}
void solve(int l,int r){
  int c=0;
  for(int j=l;j<=r;j++)if(!done[j])c++;
  if(c<=1)return;
  int mid=l+(r-l)/2;
  move(mid+1,r);
  vector<int>have;
  
  for(int i=l;i<=mid;i++)if(!done[i]){
    if(Query(i)==cs)have.pb(i);
    else Query(i);
  }
  for(auto i:have){
    bound[i].f=mid+1,bound[i].s=r,ans[i]=mid;
  }
  for(int k=0;k<15;k++){
    vector<pii>q;
    for(auto i:have)if(bound[i].f<=bound[i].s){
      q.pb({(bound[i].s+bound[i].f)/2,i});
    }
    if(q.empty())break;
    sort(rall(q));
    for(auto j:q){
      move(mid+1,j.f);
      if(Query(j.s)==cs-1){
        ans[j.s]=max(ans[j.s],j.f);
        bound[j.s].f=j.f+1;
      }
      else bound[j.s].s=j.f-1;
      Query(j.s);
    }
  }
  for(auto i:have){
    done[i]=1;
    done[ans[i]+1]=1;
    Answer(i,ans[i]+1);
    Query(i);
  }
  solve(l,mid);
  solve(mid+1,r);
}
void Solve(int n){
  n*=2;
  int mid=1+(n-1)/2;
  for(int i=mid+1;i<=n;i++)cs=Query(i);
  cl=mid+1,cr=n;
  solve(1,n);
}
/*
p bs?
*/
Compilation message (stderr)
minerals.cpp:33:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
   33 | #pragma GCC optimize ("03,unroll-lopps")
      |                                        ^
minerals.cpp:41:22: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   41 | void move(int l,int r){
      |                      ^
minerals.cpp:54:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   54 | void solve(int l,int r){
      |                       ^
minerals.cpp:95:17: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   95 | void Solve(int n){
      |                 ^| # | 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... | 
| # | 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... |