8pts求调
查看原帖
8pts求调
841638
Igunareo楼主2024/4/7 22:35
#include<bits/stdc++.h>
using namespace std;
struct edge{
	int l,r,val;
}y[53000000];
int root[1000005];
int x[1000005];
int top=0;
void build(int now,int l,int r){
	if(l==r){
		y[now].val=x[l];
		return;
	}
	int mid=(l+r)/2;
	y[now].l=top+1;
	y[now].r=top+2;
	top++;
	build(top,l,mid);
	top++;
	build(top,mid+1,r);
	return;
}
void up(int now,int had,int l,int r,int a,int p){
	if(l==r&&l==a){
		y[now].val=p;
		return;
	}
	int mid=(l+r)/2;
	if(a<=mid){
		top++;
		y[now].l=top;
		y[now].r=y[had].r;
		up(top,y[had].l,l,mid,a,p);
	}
	else{
		top++;
		y[now].l=y[had].l;
		y[now].r=top;
		up(top,y[had].r,mid+1,r,a,p);
	}
	//cout<<y[now].l<<' '<<y[now].r<<endl;
	return;
}
int down(int now,int l,int r,int a){
	//cout<<l<<' '<<r<<' '<<a<<endl;
	if(l==r&&l==a)return y[now].val;
	int mid=(l+r)/2;
	if(a<=mid)return down(y[now].l,l,mid,a);
	else return down(y[now].r,mid+1,r,a);
}
int main(){
	int now=1;
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&x[i]);
	build(0,1,n);
	while(m--){
		int kind,num,got;
		scanf("%d%d%d",&num,&kind,&got);
		if(kind==1){
			int go;
			scanf("%d",&go);
			now++;
			top++;
			root[now]=top;
			//cout<<top<<' '<<now<<endl;
			up(top,root[num],1,n,got,go);
		}
		else printf("%d\n",down(root[num],1,n,got));
	}
	return 0;
}
2024/4/7 22:35
加载中...