求调(教,最后一个点RE
查看原帖
求调(教,最后一个点RE
909549
LengSC楼主2023/12/16 16:12

Code

#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

const int N = 3e5 + 2;
const int M = 5e4 + 2;

int n, m, s;
int tr[N << 2], pos[N], a[N], ans[M];

struct Que {
	int l, r, k, id;

	bool operator<(const Que &b) const {
		return pos[l] == pos[b.l] ? r < b.r : l < b.l;
	}
};

struct Num {
	int v, id;

	bool operator<(const Num &b) const {
		return v < b.v;
	}
};

Que q[M];
Num nm[N];

void pushup(const int &rt) {
	tr[rt] = tr[rt << 1] + tr[rt << 1 | 1];
}

void update(const int &k, const int &c, const int &l, const int &r, const int &rt) {
	if (l == k && r == k) {
		tr[rt] += c;
		return;
	}
	tr[rt] += c;
	int mid = (l + r) >> 1;
	if (k <= mid) {
		update(k, c, l, mid, rt << 1);
	} else {
		update(k, c, mid + 1, r, rt << 1 | 1);
	}
	pushup(rt);
}

int query(const int &k, const int &l, const int &r, const int &rt) {
	if (l == r) {
		return l;
	}
	int mid = (l + r) >> 1;
	if (tr[rt << 1] >= k) {
		return query(k, l, mid, rt << 1);
	} else {
		return query(k - tr[rt << 1], mid + 1, r, rt << 1 | 1);
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> n >> m;
	s = (int) (sqrt(n));

	for (int i = 1; i <= n; ++i) {
		cin >> nm[i].v;
		nm[i].id = i;
		pos[i] = (i - 1) / s + 1;
	}
	sort(nm, nm + n + 1);
	for (int i = 1; i <= n; ++i) {
		a[nm[i].id] = i;
	}

	for (int i = 1; i <= m; ++i) {
		cin >> q[i].l >> q[i].r >> q[i].k;
		q[i].id = i;
	}
	sort(q + 1, q + m + 1);

	for (int i = 1, l = 1, r = 0; i <= m; ++i) {
		while (r < q[i].r) update(a[++r], 1, 1, n, 1);
		while (r > q[i].r) update(a[r--], -1, 1, n, 1);
		while (l < q[i].l) update(a[l++], -1, 1, n, 1);
		while (l > q[i].l) update(a[--l], 1, 1, n, 1);
		ans[q[i].id] = nm[query(q[i].k, 1, n, 1)].v;
	}

	for (int i = 1; i <= m; ++i) {
		cout << ans[i] << endl;
	}
	return 0;
}
2023/12/16 16:12
加载中...