0pts 求助,整个人都不好了
查看原帖
0pts 求助,整个人都不好了
289056
北射天狼楼主2023/7/21 21:33

写这坨答辩的时候我脑袋糊成了一团平衡树 —— 上下翻转。

#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int s = 0,f = 1;char c = getchar();
	while (!isdigit(c)){if (c == '-')f = -1;c = getchar();}
	while (isdigit(c)){s = (s << 3) + (s << 1) + (c ^ 48);c = getchar();}
	return s*f;
}
const int N = 2e6 + 5;
int n,m;
int root[N],a[N];
struct President_Tree{
	int idx;
	struct node{
		int l,r,val;
	}tree[N<<4];
	int build(int l,int r){
		idx++;
		if (l == r){
			tree[idx].val = a[l];
			return idx;
		}
		int mid = (l + r)/2;
		tree[idx].l = build(l,mid);
		tree[idx].r = build(mid+1,r);
		return idx;
	}
	int update(int node,int l,int r,int x,int val){
	    tree[++idx] = tree[node];
		if (l == r){
			tree[node].val = val;
			return idx;
		}
		int mid = (l + r)/2;
		if (x <= mid) tree[idx].l = update(tree[idx].l,l,mid,x,val);
		else tree[idx].r = update(tree[idx].r,mid+1,r,x,val);
		return idx;
	}
	int query(int node,int l,int r,int x){
		if (l == r)
		    return tree[node].val;
		int mid = (l + r)/2;
		if (x <= mid)
		    return query(tree[node].l,l,mid,x);
		return query(tree[node].r,mid+1,r,x);
	}
}Tree;
int main()
{
    n = read(); m = read();
    for (int i=1;i<=n;i++)
        a[i] = read();
    root[0] = Tree.build(1,n);
    for (int i=1;i<=m;i++){
    	int rt,op,x,y;
    	rt = read();op = read();x = read();
    	if (op == 1){
    		y = read();
    		root[i] = Tree.update(root[rt],1,n,x,y);
		} else {
			printf("%d\n",Tree.query(root[rt],1,n,x));
			root[i] = root[rt];
		}
	}
	return 0;
}
2023/7/21 21:33
加载中...