线段树求救(悬赏关注)
查看原帖
线段树求救(悬赏关注)
637788
kimi0705楼主2023/1/12 15:21
#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 10;
long long m, d, n, t, num_cnt;
char ch;
struct {
	long long l, r, maxx;
} tree[N >> 2];
void built(long long i, long long l, long long r) {
	tree[i].l = l;
	tree[i].r = r;
	if (l == r) return;
	long long mid = (l + r) / 2;
	built(i * 2, l, mid);
	built(i * 2 + 1, mid + 1, r);
}
void add(long long i, long long j, long long k) {
	tree[i].maxx = max(k, tree[i].maxx);
	if (tree[i].l == tree[i].r) return;
	long long mid = (tree[i].l + tree[i].r) / 2;
	if (j <= mid) add(i * 2, j, k);
	if (j > mid) add(i * 2 + 1, j, k);
}
long long get_max(long long i, long long l, long long r) {
	if (l <= tree[i].l && tree[i].r <= r ) return tree[i].maxx;
	if (tree[i * 2].r >= l)return  get_max(i * 2, l, r);
	if (tree[i * 2 + 1].l <= r) return get_max(i * 2 + 1, l, r);
}
int main() {
	cin >> m >> d;
	built(1, 1, m);
	for (long long i = 1; i <= m; i++) {
		cin >> ch >> n;
		if (ch == 'A') {
			add(1, ++num_cnt, (n % d + t % d) % d);
		} else {
			t = get_max(1, num_cnt - n + 1, num_cnt);
			cout << t << endl;
		}
	}
	return 0;
}
2023/1/12 15:21
加载中...