Submission #1320738

#TimeUsernameProblemLanguageResultExecution timeMemory
1320738ppmn_6Index (COCI21_index)C++20
0 / 110
9 ms8760 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
 
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
 
// https://codeforces.com/blog/entry/79148
class Timer: chrono::high_resolution_clock {
    const time_point start_time;
public:
    Timer(): start_time(now()) {}
    rep elapsed_time() const {
		return chrono::duration_cast<chrono::milliseconds>(now() - start_time).count();
	}
} timer;

struct FenwickTree {
	int n;
	vector<int> tree;
	FenwickTree(int n_) {
		n = n_;
		tree.resize(n + 1, 0);
	}
	void update(int p) {
		while (p <= n) {
			tree[p]++;
			p += p & (-p);
		}
	}
	int prefixQuery(int r) {
		int res = 0;
		while (r) {
			res += tree[r];
			r -= r & (-r);
		}
		return res;
	}
	int query(int l, int r) {
		return prefixQuery(r) - prefixQuery(l - 1);
	}
};
 
int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);
	int n, q;
	cin >> n >> q;
	vector<vector<int>> pos(2e5 + 1);
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		pos[x].push_back(i);
	}
	vector<pair<int, int>> queries(q);
	for (int i = 0; i < q; i++) {
		cin >> queries[i].first >> queries[i].second;
	}
	queue<tuple<int, int, vector<int>>> bs;
	vector<int> init(q), ans(q, 0), all, nxt(2e5, 0), pr(2e5);
	for (int i = 2e5; i; i--) {
		if (pos[i].size()) {
			all.push_back(i);
		}
	}
	for (int i = 0; i < all.size() - 1; i++) {
		nxt[all[i]] = all[i + 1];
	}
	for (int i = 1; i < all.size(); i++) {
		pr[all[i]] = all[i - 1];
	}
	pr[all[0]] = 1e9;
	pr[0] = all.back();
	iota(init.begin(), init.end(), 0);
	bs.push({1, 2e5, init});
	int cur = all[0];
	FenwickTree fwt(n);
	while (bs.size()) {
		auto [l, r, v] = bs.front();
		bs.pop();
		if (r - l <= 2) {
			if (pr[cur] < r) {
				fwt = FenwickTree(n);
				cur = all[0];
			}
			while (cur >= r) {
				for (auto &i : pos[cur]) {
					fwt.update(i);
				}
				cur = nxt[cur];
			}
			for (auto &i : v) {
				auto &[lb, rb] = queries[i];
				if (fwt.query(lb, rb) >= r) {
					ans[i] = max(ans[i], r);
				}
			}
			while (cur >= l + 1) {
				for (auto &i : pos[cur]) {
					fwt.update(i);
				}
				cur = nxt[cur];
			}
			for (auto &i : v) {
				auto &[lb, rb] = queries[i];
				if (fwt.query(lb, rb) >= l + 1) {
					ans[i] = max(ans[i], l + 1);
				}
			}
			while (cur >= l) {
				for (auto &i : pos[cur]) {
					fwt.update(i);
				}
				cur = nxt[cur];
			}
			for (auto &i : v) {
				auto &[lb, rb] = queries[i];
				if (fwt.query(lb, rb) >= l) {
					ans[i] = max(ans[i], l);
				}
			}
		}
		else {
			int m = (l + r) / 2;
			if (pr[cur] < m) {
				fwt = FenwickTree(n);
				cur = all[0];
			}
			while (cur >= m) {
				for (auto &i : pos[cur]) {
					fwt.update(i);
				}
				cur = nxt[cur];
			}
			vector<int> vl, vr;
			for (auto &i : v) {
				auto &[lb, rb] = queries[i];
				if (fwt.query(lb, rb) >= m) {
					vr.push_back(i);
				}
				else {
					vl.push_back(i);
				}
			}
			bs.push({m, r, vr});
			bs.push({l, m - 1, vl});
		}
	}
	for (auto &i : ans) {
		cout << i << "\n";
	}
	
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...