Submission #1192835

#TimeUsernameProblemLanguageResultExecution timeMemory
1192835nguyenkhangninh99Index (COCI21_index)C++20
110 / 110
562 ms13216 KiB

#include <bits/stdc++.h>
using namespace std;
  
const int BLOCK_SIZE = 320;

struct FenwickTree{
    vector<int> tree;
 
    void init(int n){
        tree.assign(n + 2, 0);
        
    }
 
    void update(int v, int val) {
        for (; v < tree.size(); v += v & (-v)){
            tree[v]+= val;
        }
    }
    
    int get(int v) {
        int res = 0;
        for (; v; v -= v & (-v)){
            res += tree[v];
        }
        return res;
    }
} bit;

bool cmp(array<int, 3> a, array<int, 3> b) {
    if (a[0] / BLOCK_SIZE == b[0] / BLOCK_SIZE) return a[1] < b[1];
    return a[0] / BLOCK_SIZE < b[0] / BLOCK_SIZE;
}
 
void solve(){
    int n, q; cin >> n >> q;

    vector<int> p(n + 1), ans(q + 1);
    vector<array<int, 3>> qry(q + 1);

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

    for(int i = 1; i <= q; i++){
        int l, r; cin >> l >> r;
        qry[i] = {l, r, i};
    }

    sort(qry.begin() + 1, qry.end(), cmp);
    bit.init(2000005);

    int curl = 1, curr = 0;
	for(int i = 1; i <= q; i++) {
		int l = qry[i][0], r = qry[i][1];
		while(curl > l){
            curl--; 
            bit.update(p[curl], 1);
		}
		while(curl < l) {
			bit.update(p[curl], -1); 
            curl++;
		}
		while(curr < r){
			curr++;
			bit.update(p[curr], 1);		
		}
		while(curr > r) {
			bit.update(p[curr], -1); 
			curr--;
		} 

		int low = 1, high = 2000000, res = 1;
		while(low <= high) {
			int mid = (low + high) / 2;
			if(bit.get(2000000) - bit.get(mid - 1) >= mid){
				low = mid + 1;
				res = mid;
			} else high = mid - 1;
		}
		ans[qry[i][2]] = res;
	}

	for(int i = 1; i <= q; i++) cout << ans[i] << "\n";
}
 
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...