主席树50pts求调
查看原帖
主席树50pts求调
1074372
talent_wei楼主2024/11/5 21:36
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define LL __int128
#define mid (l+r >> 1)
#define ls(o) t[o].l
#define rs(o) t[o].r

const int N = 1e5 + 5;
int n, root[N], now, tot;

struct SegTree {
	int l, r, sum;
} t[N * 28];

void pushup(int o) {
	t[o].sum = t[ls(o)].sum + t[rs(o)].sum;
}

int build(int l, int r) {
	int o = ++tot;
	if(l == r) return o;
	ls(o) = build(l, mid); 
	rs(o) = build(mid+1, r);
	pushup(o); return o;
}

int add(int pre, int l, int r, int pos, int p) {
	int o = ++tot;
	t[o].l = t[pre].l;
	t[o].r = t[pre].r;
	t[o].sum = t[pre].sum;
	if(l == r) { t[o].sum = p; return o; }
	if(pos <= mid) t[o].l = add(ls(pre), l, mid, pos, p);
	else t[o].r = add(rs(pre), mid+1, r, pos, p);
	pushup(o); return o;
}

int query(int o, int l, int r, int pos) {
	if(l == r) return t[o].sum;
	if(pos <= mid) return query(ls(o), l, mid, pos);
	return query(rs(o), mid+1, r, pos);
}

int main() {
	scanf("%d", &n);
	root[0] = build(1, n);
	for(int i = 1; i <= n; i++) {
		int x; char opt, a;
		cin >> opt;
		if(opt == 'T') {
			cin >> a; now++;
			root[now] = add(root[now-1], 1, n, now, a);
		} else if(opt == 'U') {
			scanf("%d", &x); 
			now -= x;
		} else {
			scanf("%d", &x);
			cout << (char)query(root[now], 1, n, x) << "\n";
		}
	}
	return 0;
}
2024/11/5 21:36
加载中...