8pts求助(玄关)
查看原帖
8pts求助(玄关)
1287433
__ycy1124__楼主2024/7/16 11:32
#include<bits/stdc++.h>
using namespace std;
struct Node{
	int l,r,w,i,z,y;//z为左子树,y为右子树。 
}a[10000001];
int rot[1000001];
int w[1000001];
void read(int &x){
	x=0;
	int f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-f;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x*=10;
		x+=ch-'0';
		ch=getchar(); 
	}
	x*=f;
}
int tot=0;
void New_tree(int l,int r,int p){
	a[p].l=l;
	a[p].r=r;
	a[p].i=p;
	if(l==r){
		a[p].w=w[l];
		return;
	}
	int mid=l+r>>1;
	a[p].z=tot+1;
	a[p].y=tot+2;
	New_tree(l,mid,++tot);
	New_tree(mid+1,r,++tot);
}
void New_Tree(int l,int r,int rot1,int rot2,int loc,int val){
	int mid=l+r>>1;
	a[rot2].l=l;
	a[rot2].r=r;
	if(l==r){
		a[rot2].w=val;
		return;
	}
	if(loc>mid){
		a[rot2].z=a[rot1].z;
		a[rot2].y=++tot;
		New_Tree(mid+1,r,a[rot1].y,a[rot2].y,loc,val);
	}
	else{
		a[rot2].y=a[rot1].y;
		a[rot2].z=++tot;
		New_Tree(l,mid,a[rot1].z,a[rot2].z,loc,val);
	}
}
int find(int rot1,int l,int r,int loc){
	int mid=l+r>>1;
	if(a[rot1].l==a[rot1].r){
		return rot1;
	}
	if(loc>mid){
		return find(a[rot1].y,mid+1,r,loc);
	}
	else{
		return find(a[rot1].z,l,mid,loc);
	}
}
int dfs(int p){
	if(a[p].z!=0){
		dfs(a[p].z); 
	}
	printf("%d ",a[p].w);
	if(a[p].y!=0){
		dfs(a[p].y);
	}
}
int js=0;
int main(){
	int n,m;
	read(n);
	read(m);
	rot[0]=1;
	for(int i=1;i<=n;i++){
		scanf("%d",&w[i]);
	}
	New_tree(1,n,++tot);
	for(int i=1;i<=m;i++){
		int v,op,loc;
		read(v);
		read(op);
		read(loc);
		if(op==1){
			int val;
			read(val);
			rot[++js]=++tot;
			New_Tree(1,n,rot[v],rot[js],loc,val);
			//for(int i=0;i<=js;i++){
			//	dfs(rot[i]);
			//	printf("\n");
			//}
		}
		else{
			printf("%d\n",a[find(rot[v],i,n,loc)].w);
		}
	}
	//for(int i=1;i<=js;i++){
	//	dfs(rot[i]);
	//	printf("\n");
	//}
	return 0;
}
2024/7/16 11:32
加载中...