主席树求调 悬关
查看原帖
主席树求调 悬关
531206
intemist楼主2023/11/21 16:03
#include <bits/stdc++.h>
#define mk make_pair
#define pb emplace_back
 
using namespace std;
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (! isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
	while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }
	return x * f;
}
 
const int maxn = 1e5 + 10;
int n, m, T[maxn];
struct ele { int id, v; } b[maxn];
 
namespace zeg {
	int tot;
 
	struct Node { int l, r; } t[maxn << 5];
	struct val { 
		int ls, rs, s, l; 
		val operator + (const val x) const {
			return val {
				ls + (ls == l) * x.ls,
				x.rs + (x.rs == x.l) * rs,
				max({rs + x.ls, s, x.s}),
				l + x.l
			};
		}
	} v[maxn << 5];
 
	void up(int p) { v[p] = v[t[p].l] + v[t[p].r]; }
	int bld(int l, int r) {
		int p = ++ tot, mi = l + r >> 1;
		if (l ^ r) t[p].l = bld(l, mi), t[p].r = bld(mi + 1, r), up(p);
		else v[p] = val {0, 0, 0, 1}; return p;
	}
 
	int upd(int p, int l, int r, int x) {
		int p1 = ++ tot, mi = l + r >> 1;
 
		t[p1] = t[p];
		if (l == r) return v[p1] = val {1, 1, 1, 1}, p1;
		if (x <= mi) t[p1].l = upd(t[p].l, l, mi, x);
		else t[p1].r = upd(t[p].r, mi + 1, r, x);
 
		return up(p1), p1;
	}
 
	val qry(int p, int l, int r, int x, int y) {
		if (x <= l && r <= y) return v[p];
 
		int mi = l + r >> 1;
		val ans = val {0, 0, 0, 0};
		if (x <= mi) ans = qry(t[p].l, l, mi, x, y);
		if (mi < y) ans = qry(t[p].r, mi + 1, r, x, y) + ans;
 
		return ans;
	}
}
 
using namespace zeg;
 
int main() {
	
	n = read();
	for (int i = 1; i <= n; i ++) b[i] = ele {i, read()};
 
	sort(b + 1, b + n + 1, [](ele a, ele b) { return a.v > b.v; });
 
	T[0] = bld(1, n);
	for (int i = 1; i <= n; i ++)
		T[i] = upd(T[i - 1], 1, n, b[i].id);
 
	m = read();
	for (int i = 1; i <= m; i ++) {
		int L = read(), R = read(), k = read();
 
		int l = 1, r = n;
		while (l + 1 < r) {
			int mi = l + r >> 1;
			if (qry(T[mi], 1, n, L, R).s >= k) r = mi;
			else l = mi;
		}
 
		if (qry(T[l], 1, n, L, R).s >= k) printf("%d\n", b[l].v);
		else printf("%d\n", b[r].v);
	}
 
	return 0;
}
2023/11/21 16:03
加载中...