Submission #1337058

#TimeUsernameProblemLanguageResultExecution timeMemory
1337058SofiatpcIndex (COCI21_index)C++20
110 / 110
1057 ms48868 KiB
#include <bits/stdc++.h>

using namespace std;

#define sz(v) (int)v.size()
#define fi first
#define sc second
const int MAXN = 2*1e5+5;
pair<int,int> o[MAXN];
vector<int> sum,e,d,rz;

int create(){
    sum.push_back(0);
    e.push_back(0);
    d.push_back(0);
    return sz(sum)-1;
}

int update(int node, int l, int r, int i){
    int novo = create();
    sum[novo] = sum[node];
    e[novo] = e[node];
    d[novo] = d[node];

    if(l == r){
        sum[novo]++;
        return novo;
    }

    int mid = (l+r)/2;
    if(i <= mid){
        int aux = update(e[novo], l, mid, i);
        e[novo] = aux;
    }else{
        int aux = update(d[novo], mid+1, r, i);
        d[novo] = aux;
    }

    sum[novo] = sum[e[novo]]+sum[d[novo]];
    return novo;
}

int query(int node, int l, int r, int i, int j){
    if(node == 0 || j < l || r < i)return 0;
    if(i <= l && r <= j)return sum[node];

    int mid = (l+r)/2;
    return query(e[node],l,mid,i,j) + query(d[node],mid+1,r,i,j);
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n,q, mx = 0; cin>>n>>q;
    for(int i = 1; i <= n; i++){
        int p; cin>>p;
        mx = max(mx,p);
        o[i] = {-p,i};
    }
    sort(o+1,o+1+n);

    create(); rz.push_back(0); int pt = 1;
    for(int i = mx; i >= 1; i--){
        int nxt = rz.back();
        while(pt <= n && -o[pt].fi == i){
            int aux = update(nxt,1,n, o[pt].sc);
            nxt = aux;
            pt++;
        }
        rz.push_back(nxt);
    }
    
    for(int i = 1; i <= q; i++){
        int ini, fim; cin>>ini>>fim;

        int l = 1, r = mx;
        while(l != r){
            int mid = (l+r+1)/2;
            if(query(rz[mx-mid+1], 1, n, ini, fim) >= 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...