Submission #1154428

#TimeUsernameProblemLanguageResultExecution timeMemory
1154428WongYiKaiIndex (COCI21_index)C++20
60 / 110
2594 ms48336 KiB


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll MAXN = 200005, INF = 200005;
 
vector<int> t[4*MAXN];

void build(int a[], int v, int tl, int tr) {
    if (tl == tr) {
        t[v] = vector<int>(1, a[tl]);
    } else { 
        int tm = (tl + tr) / 2;
        build(a, v*2, tl, tm);
        build(a, v*2+1, tm+1, tr);
        merge(t[v*2].begin(), t[v*2].end(), t[v*2+1].begin(), t[v*2+1].end(),
              back_inserter(t[v]));
    }
}

int query(int v, int tl, int tr, int l, int r, int x) {
    if (l > tr || tl > r)
        return 0;
    if (l <= tl && r >= tr) {
        vector<int>::iterator pos = upper_bound(t[v].begin(), t[v].end(), x);
        return pos-t[v].begin();
    }
    int tm = (tl + tr) / 2;
    return (query(v*2, tl, tm, l, min(r, tm), x)+
               query(v*2+1, tm+1, tr, max(l, tm+1), r, x));
}


int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	ll n,q;
	cin >> n >> q;
	int p[n+5];
	for (int i=0;i<n;i++){
		ll temp;
		cin >> temp;
		p[i] = temp;
	}

	build(p, 1, 0, n-1);
	
	
	while (q--){
		ll l,r;
		cin >> l >> r;
		ll range = r-l+1;
		ll l2=1,r2=range+5;
		while (l2<r2){
			ll m = l2+(r2-l2)/2;
			if(range - query(1, 0,n-1, l-1, r-1, m-1) >= m) l2=m+1;
			else r2=m;
		}
		cout << l2-1 << "\n";
	}
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...