Submission #1150257

#TimeUsernameProblemLanguageResultExecution timeMemory
1150257nikolashamiIndex (COCI21_index)C++20
110 / 110
1175 ms97244 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const ll N=2e5,N2=5+24*N;
ll root[N2],lc[N2],rc[N2],st[N2],nd;

void bd(ll lik,ll l=1,ll r=N){
	if(l==r)return;
	lc[lik]=++nd;
	rc[lik]=++nd;
	bd(lc[lik],l,(l+r)/2);
	bd(rc[lik],(l+r)/2+1,r);
}

void upd(ll pr,ll tr,ll id,ll l=1,ll r=N){
	if(l==r){st[tr]=1+st[pr];return;}
	ll md=(l+r)/2;
	if(id<=md){
		rc[tr]=rc[pr];
		lc[tr]=++nd;
		upd(lc[pr],lc[tr],id,l,md);
	}else{
		lc[tr]=lc[pr];
		rc[tr]=++nd;
		upd(rc[pr],rc[tr],id,md+1,r);
	}
	st[tr]=st[lc[tr]]+st[rc[tr]];
}

ll walk(ll pr,ll tr,ll x,ll l=1,ll r=N){
	if(l==r)return l;
	ll md=(l+r)/2;
	ll rgt=st[rc[tr]]-st[rc[pr]];
	if(rgt>=x)return walk(rc[pr],rc[tr],x,md+1,r);
	else return walk(lc[pr],lc[tr],x-rgt,l,md);
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    ll n,q;
    cin>>n>>q;

    root[0]=++nd;
    bd(root[0]);

    for(int i=1;i<=n;++i){
    	ll x;cin>>x;
    	root[i]=++nd;
    	upd(root[i-1],root[i],x);
    }

    while(q--){
    	ll l,r;cin>>l>>r;
    	ll L=1,R=N,A=L;
    	while(L<=R){
    		ll M=(L+R)/2;
    		if(walk(root[l-1],root[r],M)>=M){
    			A=M;
    			L=M+1;
    		}else
    			R=M-1;
    	}
    	cout<<A<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...