整体二分

#include <bits/stdc++.h>
#define il inline

using namespace std;

bool Beg;
namespace Zctf1088 {
namespace IO {
	const int bufsz = 1 << 20;
	char ibuf[bufsz], *p1 = ibuf, *p2 = ibuf;
	#define getchar() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, bufsz, stdin), p1 == p2) ? EOF : *p1++)
	il int read() {
		int x = 0; char ch = getchar(); bool t = 0;
		while (ch < '0' || ch > '9') {t ^= ch == '-'; ch = getchar();}
		while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
		return t ? -x : x;
	}
	char obuf[bufsz], *p3 = obuf, stk[50];
	#define flush() (fwrite(obuf, 1, p3 - obuf, stdout), p3 = obuf)
	#define putchar(ch) (p3 == obuf + bufsz && flush(), *p3++ = (ch))
	il void write(int x, bool t = 0) {
		int top = 0;
		x < 0 ? putchar('-'), x = -x : 0;
		do {stk[++top] = x % 10 | 48; x /= 10;} while(x);
		while (top) putchar(stk[top--]);
		t ? putchar(' ') : putchar('\n');
	}
	struct FL {
//		~FL() {flush();}
	} fl;
}
using IO::read; using IO::write;
const int N = 3e5 + 10;
int n, qq, a[N];
struct node {
	int op, l, r, k, id, val;
} q[N], q1[N], q2[N];
int ans[N];
namespace BIT {
	int c[N];
	il void update(int x, int v) {
		for (int i = x; i <= n; i += (i & -i)) 
			c[i] += v;
	}
	il int query(int x) {
		int res = 0;
		for (int i = x; i; i -= (i & -i)) 
			res += c[i];
		return res;
	}
	il int query(int l, int r) {
		return query(r) - query(l - 1);
	}
}
il void solve(int l, int r, int L, int R)  {
	if (l > r) return;
	if (L == R) {
		for (int i = l; i <= r; i++) 
			if (q[i].op == 2) ans[q[i].id] = L;
		return;
	}
	int mid = (L + R) >> 1;
	int tot1 = 0, tot2 = 0;
	for (int i = l; i <= r; i++) {
		if (q[i].op == 1) {
			if (q[i].k <= mid) {
				BIT::update(q[i].id, q[i].val);
				q1[++tot1] = q[i];
			} else q2[++tot2] = q[i];
		} else {
			int x = BIT::query(q[i].l, q[i].r);
			if (q[i].k <= x) q1[++tot1] = q[i];
			else {
				q[i].k -= x;
				q2[++tot2] = q[i];
			}
		}
	}
	for (int i = 1; i <= tot1; i++) 
		if (q1[i].op == 1) BIT::update(q1[i].id, - q1[i].val);
	for (int i = 1; i <= tot1; i++) q[l + i - 1] = q1[i];
	for (int i = 1; i <= tot2; i++) q[l + tot1 + i - 1] = q2[i];
	solve(l, l + tot1 - 1, L, mid);
	solve(l + tot1, r, mid + 1, R);
}
signed main() {
	ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
	cin >> n >> qq;
	for (int i = 1; i <= n; i++) cin >> a[i];
	int tot = 0;
	for (int i = 1; i <= n; i++) 
		q[++tot] = {1, 0, 0, a[i], i, 1};
	int tim = 0;
	for (int i = 1; i <= qq; i++) {
		string s; cin >> s;
		if (s == "C") {
			int x, v; cin >> x >> v;
			q[++tot] = {1, 0, 0, a[x], x, -1};
			q[++tot] = {1, 0, 0, v, x, 1};
			a[x] = v;
		} else {
			int l, r, k; cin >> l >> r >> k;
			q[++tot] = {2, l, r, k, ++tim, 0};
		}
	}
	solve(1, tot, 0, 1e9);
	for (int i = 1; i <= tim; i++) 
		cout << ans[i] << "\n";
	return 0;
}}
bool End;
il void Usd() {cerr << "\nUse: " << (&Beg - &End) / 1024.0 / 1024.0 << "MB " << (double)clock() * 1000.0 / CLOCKS_PER_SEC << "ms\n";}
signed main() {
	Zctf1088::main();
	Usd();
	return 0;
}
posted @ 2026-09-18 16:46  Zctf1088  阅读(5)  评论(0)    收藏  举报