神奇RE,MnZn求调
查看原帖
神奇RE,MnZn求调
572587
cmrhhh楼主2024/3/23 09:57

RE力

#include<iostream>
using namespace std;
const int MAXN=3e7+10;
int n,m,a[MAXN],vi,loci,opi,vali;
int tree_tot=0,root[MAXN];//root[i]为i版本的根编号,刚开始编号为0 
struct Tree{
	int l,r,val;
}tree[MAXN*4];

int cpy(int id){
	tree[++tree_tot]=tree[id];
	return tree_tot;
}

int build(int id,int l,int r){
	id=++tree_tot;
	if(l==r){
		tree[id].val=a[l];
		return id;
	}
	int mid=l+r>>1;
	tree[id].l=build(0,l,mid);
	tree[id].r=build(0,mid+1,r);
	return id;
}

int update(int id,int l,int r,int loc,int val){
	id=cpy(id);
	if(l==r)tree[id].val=val;
	else {
		int mid=l+r>>1;
		if(mid>=loc)tree[id].l=update(tree[id].l,l,mid,loc,val);//等号记得带上 
		if(mid<loc) tree[id].r=(tree[id].l,mid+1,r,loc,val);//左右儿子可能会改变 
	}
	return id;
}

int query(int id,int l,int r,int loc){
	if(l==r)return tree[id].val;
	int op;
	int mid=l+r>>1;
	if(mid>=loc) op=query(tree[id].l,l,mid,loc);
	else op=query(tree[id].r,mid+1,r,loc);
	return op;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)scanf("%d",&a[i]);
	build(0,1,n);root[0]=1;
	for(int i=1;i<=m;++i){
		scanf("%d%d%d",&vi,&opi,&loci);
		if(opi==1){
			scanf("%d",&vali);
			root[i]=update(root[vi],1,n,loci,vali);
		}
		if(opi==2){
			printf("%d\n",query(root[vi],1,n,loci));
			root[i]=root[vi];
		}
	}
	return 0;
} 

借鉴了第一篇题解orz
救救孩子吧,真不知道哪里错了

2024/3/23 09:57
加载中...