# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1154438 | WongYiKai | Index (COCI21_index) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
typedef intg ll;
const ll MAXN = 200005;
vector<int> t[4*MAXN];
int a[MAXN];
void build(int v, int tl, int tr) {
if (tl == tr) {
t[v] = {a[tl]};
return;
}
int tm = (tl + tr) / 2;
build(v*2, tl, tm);
build(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) {
return t[v].end() - lower_bound(t[v].begin(), t[v].end(), x);
}
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;
for (int i=0;i<n;i++){
ll temp;
cin >> temp;
a[i] = temp;
}
build(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 (r2-l2==1) m=r2;
if(query(1, 0,n-1, l-1, r-1, m) >= m) l2=m;
else r2=m-1;
}
cout << l2 << "\n";
}
}