Submission #1337090

#TimeUsernameProblemLanguageResultExecution timeMemory
1337090enzyIndex (COCI21_index)C++20
110 / 110
1461 ms147668 KiB
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
const int maxn=2e5+10;
struct node{
    int val;
    node *l, *r;
    node(): val(0), l(nullptr), r(nullptr) {}
    node(int x): val(x), l(nullptr), r(nullptr) {}
    node(node *ll, node *rr){
        l=ll; r=rr;
        val=0;
        if(l) val+=l->val;
        if(r) val+=r->val;
    }
    node(node *cp): val(cp->val), l(cp->l), r(cp->r) {} // tira copia
};
node *roots[maxn];
node *build(int ini, int fim){
    if(ini==fim) return new node(0);
    int mid=(ini+fim)/2;
    return new node(build(ini,mid),build(mid+1,fim));
}
node *update(node *id, int ini, int fim, int cara){
    // cerr << ini << ' ' << fim << '\n';
    if(ini==fim) return new node(1);
    int mid=(ini+fim)/2;
    if(cara<=mid) return new node(update(id->l,ini,mid,cara),id->r);
    else return new node(id->l,update(id->r,mid+1,fim,cara));
}
int query(node *id, int ini, int fim, int l, int r){
    if(ini>r||fim<l) return 0;
    if(l<=ini&&fim<=r) return id->val;
    int mid=(ini+fim)/2;
    return query(id->l,ini,mid,l,r)+query(id->r,mid+1,fim,l,r);
}
vector<int>caras[maxn];
int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int n, q; cin >> n >> q;
    for(int i=1;i<=n;i++){
        int a; cin >> a;
        caras[min(a,n)].push_back(i);
    }
    roots[0]=build(1,n);
    for(int i=1;i<=n;i++){
        // cerr << "! " << i << '\n';
        roots[i]=new node(roots[i-1]);
        for(int x : caras[i]) roots[i]=update(roots[i],1,n,x);
    }
    for(int i=1;i<=q;i++){
        int a, b; cin >> a >> b;
        int l=1, r=n;
        while(l<r){
            int mid=(l+r+1)/2;
            if(query(roots[n],1,n,a,b)-query(roots[mid-1],1,n,a,b)>=mid) l=mid;
            else r=mid-1;
        }
        cout << l << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...