Submission #747040

#TimeUsernameProblemLanguageResultExecution timeMemory
747040SzilIndex (COCI21_index)C++17
60 / 110
2555 ms136324 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 200001;

struct Node {
	Node *l, *r;
	int sum = 0;

	Node(Node *left, Node *right) : l(left), r(right) {
		if (l) sum += l->sum;
		if (r) sum += r->sum;
	}

	Node(int s) : sum(s) {}
};

Node *build(int tl, int tr) {
	if (tl == tr) {
		return new Node(0);
	} else {
		int tm = (tl + tr) / 2;
		return new Node(build(tl, tm), build(tm+1, tr));
	}
}

Node *upd(Node *v, int tl, int tr, int pos) {
	if (tl == tr) {
		return new Node(v->sum+1);
	} else {
		int tm = (tl + tr) / 2;
		if (pos <= tm) {
			return new Node(upd(v->l, tl, tm, pos), v->r);
		} else {
			return new Node(v->l, upd(v->r, tm+1, tr, pos));
		}
	}
}

int qry(Node *v, int tl, int tr, int l, int r) {
	if (l > r) return 0;
	if (l == tl && r == tr) {
		return v->sum;
	} else {
		int tm = (tl + tr) / 2;
		return qry(v->l, tl, tm, l, min(tm, r)) + qry(v->r, tm+1, tr, max(tm+1, l), r);
	}
}

const int MAXV = 200001;

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	int n, q; cin >> n >> q;
	vector<Node *> roots = {build(1, MAXV)};
	for (int i = 1; i <= n; i++) {
		int x; cin >> x;
		roots.push_back(upd(roots.back(), 1, MAXV, x));
	}
	while (q--) {
		int l, r; cin >> l >> r;
		int lo = 1, hi = r-l+1;
		while (lo < hi) {
			int mid = (lo + hi + 1) / 2;
			int cnt = qry(roots[r], 1, MAXV, mid, MAXV) - qry(roots[l-1], 1, MAXV, mid, MAXV);
			if (cnt >= mid) {
				lo = mid;
			} else {
				hi = mid - 1;
			}
		}
		cout << lo << "\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...