Submission #1334347

#TimeUsernameProblemLanguageResultExecution timeMemory
1334347Zone_zoneeIndex (COCI21_index)C++20
110 / 110
482 ms23636 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;

int fw[N];
void upd(int idx){
    for(; idx < N; idx += idx&(-idx)) fw[idx]++;
}
int q(int idx){
    int res = 0;
    for(; idx > 0; idx -= idx&(-idx)) res += fw[idx];
    return res;
}
int query(int l, int r){
    return q(r) - q(l-1);
}
int a[N]; //n
int x[N], y[N], l[N], r[N]; //q
vector<int> pos[N]; //max(a[i])
vector<int> queries[N]; //n
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, q;
    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] = y[i]-x[i]+2;
    }
    for(int cnt = 0; cnt < log2(N); ++cnt){
        bool finished = 1;
        for(int i = 1; i < N; ++i) queries[i].clear();
        for(int i = 1; i <= q; ++i){
            if(l[i] != r[i]){
                finished = 0;
                queries[(l[i]+r[i])>>1].push_back(i);
            }
        }
        if(finished) break;
        memset(fw, 0, sizeof fw);
        for(int i = N-1; i >= 1; --i){
            for(int idx : pos[i]) upd(idx);
            for(int idx : queries[i]){
                if(query(x[idx], y[idx]) >= i) l[idx] = i;
                else r[idx] = i;
            }
        }
    }
    for(int i = 1; i <= q; ++i){
        cout << l[i] << '\n';
    }
}
/*
7 6
3 2 3 1 1 4 7
3 4
1 7
1 6
4 5
1 2
5 7
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...