问:此程序为何有错?
查看原帖
问:此程序为何有错?
335043
数学小蓝本楼主2020/8/4 21:38

调了好久,改了又改

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n, m, root[N], cnt;
struct tree {
	int lc, rc, val;
} t[20 * N];
int build(int l, int r) {
	int p = ++cnt;
	if (l == r) {
		scanf("%d", &t[p].val);
		return p;
	}
	int mid = (l + r) >> 1;
	t[p].lc = build(l, mid);
	t[p].rc = build(mid + 1, r);
	return p;
}
int insert(int now, int l, int r, int x, int val) {
	int p = ++cnt;
	t[p] = t[now];
	if (l == r) {
		t[p].val = val;
		return p;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) t[p].lc = insert(t[now].lc, l, mid, x, val);
	else t[p].rc = insert(t[now].rc, mid + 1, r, x, val);
	return cnt;
}
int ask(int p, int l, int r, int x) {
	if (l == r) return t[p].val;
	int mid = (l + r) >> 1;
	if (x <= mid) return ask(t[p].lc, l, mid, x);
	else return ask(t[p].rc, mid + 1, r, x);
}
int main() {
	cin >> n >> m;
	root[0] = build(1, n);
	//cout << root[0];
	for (register int i = 1; i <= m; ++i) {
		int v, op, x, y;
		scanf("%d%d%d", &v, &op, &x);
		if (op == 1) {
			scanf("%d", &y);
			root[i] = insert(root[v], 1, n, x, y);
		} if (op == 2) {
			root[i] = root[v];
			printf("%d\n", ask(root[v], 1, n, x));
		}
	}
}
2020/8/4 21:38
加载中...