Submission #494337

#TimeUsernameProblemLanguageResultExecution timeMemory
494337AlperenTIndex (COCI21_index)C++17
60 / 110
2583 ms47620 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

int n, q, arr[N], a, b, l, r, m;

struct SegTree{
    vector<int> tree[N * 4];

    void build(int v = 1, int l = 1, int r = n){
        if(l == r) tree[v].push_back(arr[l]);
        else{
            int m = l + (r - l) / 2;

            build(v * 2, l, m); build(v * 2 + 1, m + 1, r);

            tree[v].assign(tree[v * 2].size() + tree[v * 2 + 1].size(), 0);

            merge(tree[v * 2].begin(), tree[v * 2].end(), tree[v * 2 + 1].begin(), tree[v * 2 + 1].end(), tree[v].begin());
        }
    }

    int query(int l, int r, int val, int v = 1, int tl = 1, int tr = n){
        if(l > r) return 0;
        else if(tl == l && tr == r) return tree[v].end() - lower_bound(tree[v].begin(), tree[v].end(), val);
        else{
            int tm = tl + (tr - tl) / 2;

            return query(l, min(tm, r), val, v * 2, tl, tm) + query(max(tm + 1, l), r, val, v * 2 + 1, tm + 1, tr);
        }
    }
};

SegTree sgt;

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

    cin >> n >> q;

    for(int i = 1; i <= n; i++) cin >> arr[i];

    sgt.build();

    while(q--){
        cin >> a >> b;

        l = 1, r = (b - a + 1) + 1;

        while(r - l > 1){
            m = l + (r - l) / 2;

            if(sgt.query(a, b, m) >= m) l = m;
            else r = m;
        }

        cout << l << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...