那个大佬帮忙调调
查看原帖
那个大佬帮忙调调
339728
末然Ender楼主2023/7/7 16:43
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
struct node{
	int ls,rs,val;
}tree[30*N];
int a[30*N],root[30*N];
//int build(int root,int pl,int pr){
//	tree[root].ls=pl,tree[root].rs=pr;
//	if(pl==pr){
//		tree[root].val=a[pl];
//		return;
//	}
//	int mid=pr+((pr-pl)>>1);
//	build(root<<1,pl,mid),build(root<<1+1,mid+1,pr);
//	tree[root].cal=tree[root<<1].val+tree[root<<1+1].val;
//}
int n,m;
int tot=1;
int build(int pl,int pr){
	int root=tot++;
	if(pl==pr){
		tree[root].val=a[pl];
		return root;
	}
	int mid=pl+((pr-pl)>>1);
	tree[root].ls=build(pl,mid);
	tree[root].rs=build(mid+1,pr);
	return root;
}
int update(int pre,int pl,int pr,int loc,int val){
	int root=tot++;
	if(pl==pr){
		tree[root].val=a[pl];
		return root;
	}
	int mid=pl+((pr-pl)>>1);
	tree[root].ls=tree[pre].ls;
	tree[root].rs=tree[pre].rs;
	if(loc<=mid){
		tree[root].ls=update(tree[pre].ls,pl,mid,loc,val);
	}else{
		tree[root].rs=update(tree[pre].rs,mid+1,pr,loc,val);
	}
	return root;
}
int query(int p,int pl,int pr,int loc){
	if(pl==pr)return tree[p].val;
	int mid=(pl+pr)>>1;
	if(loc<=mid)return query(tree[p].ls,pl,mid,loc);
	else query(tree[p].rs,mid+1,pr,loc);
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	root[0]=build(1,n);
	for(int i=0;i<m;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		if(b==1){
			int d;
			scanf("%d",&d);
			root[i]=update(root[a],1,n,c,d);
		}else{
			printf("%d\n",query(root[a],1,n,c));
			root[i]=root[a];
		}
	}
	return 0;
}
2023/7/7 16:43
加载中...