Submission #1366095

#TimeUsernameProblemLanguageResultExecution timeMemory
1366095hamza_albrahimIndex (COCI21_index)C++20
110 / 110
962 ms60480 KiB
#include <bits/stdc++.h>
using namespace std;
 
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
 
// template<class x>
// using ordered_set = tree<x, null_type,less<x>,  rb_tree_tag,tree_order_statistics_node_update>;
 
// template<class x>
// using ordered_multiset = tree<x, null_type,less_equal<x>,  rb_tree_tag,tree_order_statistics_node_update>;
 
#define int long long
#define mod 1'000'000'007
const int mxn = 200001;
const int N = 1 << (__lg(mxn) + 1);

int T[2 * N];

void U(int v, int x){
    T[v] = x;
    v /= 2;
    while(v > 0){
        T[v] = T[2 * v] + T[2 * v + 1];
        v /= 2;
    }
}

int Q(int ql, int qr, int node = 1, int lq = 1, int rq = N){
    if(lq > qr || rq < ql){
        return 0;
    }
    if(lq >= ql && rq <= qr){
        return T[node];
    }
    int mid = (lq + rq) / 2;
    return Q(ql, qr, 2 * node, lq, mid) + Q(ql, qr, 2 * node + 1, mid + 1, rq);
}

int n, q;
int a[mxn];
int x[mxn], y[mxn], l[mxn], r[mxn], m[mxn], ans[mxn];
vector<int> queries[mxn];
vector<int> pos[mxn];

void pbs(){
    bool valid = 1;
    while(valid){
        memset(T, 0, sizeof T);
        for(int i = 1; i <= q; i++){
            if(l[i] <= r[i]){
                m[i] = (l[i] + r[i]) / 2;
                queries[m[i]].push_back(i);
            }
        }
        for(int i = mxn - 1; i > 0; i--){
            for(auto j : pos[i]){
                U(j + N - 1, 1);
            }
            for(int j : queries[i]){
                int num = Q(x[j], y[j]);
                if(num >= i){
                    ans[j] = max(i, ans[j]);
                    l[j] = m[j] + 1;
                }
                else{
                    r[j] = m[j] - 1;
                }
            }
        }
        valid = 0;
        for(int i = 1; i <= q; i++){
            if(l[i] <= r[i]){
                valid = 1;
            }
        }
        for(int i = 1; i <= q; i++){
            queries[i].clear();
        }
    }
}
 
 
signed main()
{
    ios_base::sync_with_stdio(false);cin.tie(NULL);
    
    cin>>n>>q;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
        pos[a[i]].push_back(i);
    }
    for(int i = 1; i <= q; i++){
        cin>>x[i]>>y[i];
        l[i] = 1, r[i] = n;
    }
    pbs();
    for(int i = 1; i <= q; i++){
        cout<<ans[i]<<'\n';
    }




    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...