Submission #1221792

#TimeUsernameProblemLanguageResultExecution timeMemory
1221792ereringIndex (COCI21_index)C++20
110 / 110
1290 ms140100 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl '\n'
const int N=2e5+5,MOD=1e9+7,inf=1e18;
struct node{
    int sum=0;
    node *l,*r;
};
int a[N];
node *root[N];
void build(node* cur,int lo,int hi){
    if(lo==hi)return;
    cur->l=new node;
    cur->r=new node;
    int mid=(lo+hi)/2;
    build(cur->l,lo,mid);
    build(cur->r,mid+1,hi);
}
node *update(node *cur,int idx,int lo,int hi){
    if(lo==idx && hi==idx){
        node *x=new node;
        x->sum=cur->sum+1;
        return x;
    }
    if(lo>idx || hi<idx)return cur;
    int mid=(lo+hi)/2;
    node *x=new node;
    x->l=update(cur->l,idx,lo,mid);
    x->r=update(cur->r,idx,mid+1,hi);
    x->sum=x->l->sum+x->r->sum;
    return x;
}
int query(node* cur,int qlo,int qhi,int lo,int hi){
    if(lo>qhi || hi<qlo || cur==0)return 0;
    if(lo>=qlo && hi<=qhi)return cur->sum;
    int mid=(lo+hi)/2;
    return query(cur->l,qlo,qhi,lo,mid)+query(cur->r,qlo,qhi,mid+1,hi);
}
signed main(){
   // ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n,q,offset=(1<<18); cin>>n>>q;
    root[0]=new node;
    build(root[0],0,offset);
    for(int i=0;i<n;i++){
        cin>>a[i];
        root[i+1]=update(root[i],a[i],0,offset);
    }
    while(q--){
        int l,r; cin>>l>>r;
        int lo=1,hi=2e5;
        while(lo<hi){
            int mid=(lo+hi+1)/2;
            int val=query(root[r],mid,offset,0,offset)-query(root[l-1],mid,offset,0,offset);
            if(val>=mid)lo=mid;
            else hi=mid-1;
        }
        cout<<lo<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...