MnZn求助主席树,蜜汁RE
查看原帖
MnZn求助主席树,蜜汁RE
503792
Svemit楼主2023/8/8 13:31
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int n, m;
int a[N];
struct SegT {
	int l, r, val;
	#define l(x) tr[x].l
	#define r(x) tr[x].r
	#define val(x) tr[x].val
} tr[N << 5];
int idx, rt[N];
void build(int l, int r, int &x) {
	x = ++ idx;
	if(l == r) {
		val(x) = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(l, mid, l(x)), build(mid + 1, r, r(x));
}
void insert(int lst, int &x, int l, int r, int pos, int v) {
	x = ++ idx;
	tr[x] = tr[lst];
	if(l == r) {
		val(x) = v;
		return;
	} 
	int mid = l + r >> 1;
	if(pos <= mid) insert(l(lst), l(x), l, mid, pos, v);
	else insert(r(lst), r(x), mid + 1, r, pos, v);
}
int query(int x, int l, int r, int pos) {
	if(l == r) {
		return val(x);
	}
	int mid = l + r >> 1;
	if(pos <= mid) query(l(x), l, mid, pos);
	else return query(r(x), mid + 1, r, pos);
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> a[i];
	build(1, n, rt[0]);
	for(int i = 1; i <= m; i ++) {
		int v, op, loc, value;
		cin >> v >> op >> loc;
		if(op == 1) {
			cin >> value;
			insert(rt[v], rt[i], 1, n, loc, value);
		}
		else {
			cout << query(rt[v], 1, n, loc) << '\n';
			rt[i] = rt[v];
		}
	}
    return 0;
}
2023/8/8 13:31
加载中...