Submission #1288079

#TimeUsernameProblemLanguageResultExecution timeMemory
1288079manuelferrazcIndex (COCI21_index)C++20
0 / 110
2 ms568 KiB
#include <bits/stdc++.h>

using namespace std;

#define _ ios_base::sync_with_stdio(0);cin.tie(0);
#define ff first
#define ss second
typedef long long ll;
typedef unsigned long long ull;


const int MAX = 2e5+10, UPD = 2e5+10, LOG = 18;
const int MAXS = 2*MAX+UPD*LOG;

namespace perseg {
	ll seg[MAXS];
	int rt[UPD], L[MAXS], R[MAXS], cnt, t;
	int n;

	ll build(int p, int l, int r) {
		if (l == r) return seg[p] = 0;
		L[p] = cnt++, R[p] = cnt++;
		int m = (l+r)/2;
		return seg[p] = build(L[p], l, m) + build(R[p], m+1, r);
	}
	void build(int n2) {
		n = n2;
		rt[0] = cnt++;
		build(0, 0, n-1);
	}
	ll query(int a, int b, int p, int l, int r) {
		if (b < l or r < a) return 0;
		if (a <= l and r <= b) return seg[p];
		int m = (l+r)/2;
		return query(a, b, L[p], l, m) + query(a, b, R[p], m+1, r);
	}
	ll query(int a, int b, int tt) {
		return query(a, b, rt[tt], 0, n-1);
	}
	ll update(int a, int x, int lp, int p, int l, int r) {
		if (l == r) return seg[p] = x;
		int m = (l+r)/2;
		if (a <= m)
			return seg[p] = update(a, x, L[lp], L[p]=cnt++, l, m) + seg[R[p]=R[lp]];
		return seg[p] = seg[L[p]=L[lp]] + update(a, x, R[lp], R[p]=cnt++, m+1, r);
	}
	int update(int a, int x, int tt=t) {
		update(a, x, rt[tt], rt[++t]=cnt++, 0, n-1);
		return t;
	}
};

int main() { _
    int n,q;
    cin >> n >> q;


    map<int,vector<int>> m;

    for(int i=0;i<n;i++) {
        int x;
        cin >> x;
        m[x].push_back(i);
    }

    perseg::build(n);

    vector<pair<int,int>> v;
    for(auto it = m.rbegin();it!=m.rend();it++) {
        v.push_back({it->ff,0});

        for(auto i:it->ss) v.back().ss = perseg::update(i,1);
    }

    while(q--) {
        int lq,rq;
        cin >> lq >> rq;

        lq--;
        rq--;

        int l=0,r=v.size()-1,ans = 1;

        while(l<=r) {
            int m2 = (l+r)>>1;

            int val = perseg::query(lq,rq,v[m2].ss);

            if(val>=v[m2].ff) {
                ans = v[m2].ff;
                r=m2-1;
            } else l=m2+1;
        }

        cout << ans << '\n';
    }

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