闲来无聊的大佬们点进来
查看原帖
闲来无聊的大佬们点进来
365532
Mr_ll楼主2021/11/4 19:23

首先,谢谢各大佬可以点进来

真萌新学主席树,照着题解来的,但由于本菜鸡比较(~ ̄(OO) ̄)ブ,样例都没过,

#include<iostream>
#include<cstdio>
#include<cmath> 
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e8,N=1e6;
int t,top,a[N],n,m,root[N],rt,mode,x,y;
struct qwe{
	int l,r,val;
}tr[maxn];
int clone(int t){
	top++;
	tr[top]=tr[t];
	return top;
}
int maketree(int t,int l,int r){
	 t=++top;
	 if(l==r){
	 	tr[t].val=a[l];
	 	return top;
	 }
	 int mid=(l+r)>>1;
	 tr[t].l=maketree(tr[t].l,l,mid);
	 tr[t].r=maketree(tr[t].r,mid+1,r);
	 return t;
}
int update(int t,int l,int r,int x,int z){
	t=clone(t);
	if(l==r){
		tr[t].val=z;
		return t;
	}
	int mid=(l+r)>>1;
	if(x<=mid) tr[t].l=update(tr[t].l,l,mid,x,z);
	if(x>mid) tr[t].r=update(tr[t].r,mid+1,r,x,z);
	return t;
}
int cha(int t,int l,int r,int x){
	if(l==r) return tr[t].val;
	int mid=(l+r)>>1;
	if(x<=mid) cha(tr[t].l,l,mid,x);
	if(x>mid) cha(tr[t].r,mid+1,r,x);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	root[0]=maketree(0,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&rt,&mode,&x);
		if(mode==1){
			scanf("%d",&y);
			root[i]=update(root[rt],1,n,x,y);
		}
		else{
			printf("%d\n",cha(root[rt],1,n,x));
			root[i]=root[rt];
		}
	}
	return 0;
}
2021/11/4 19:23
加载中...