求助(玄关)
查看原帖
求助(玄关)
1287433
__ycy1124__楼主2024/7/15 15:22
#include<bits/stdc++.h>
using namespace std;
struct Node{
	int l,r,w,i,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;
	if(l==r){
		a[rot2].w=val;
		return;
	}
	if(loc>mid){
		a[rot2].l=a[rot1].l;
		a[rot2].r=++tot;
		New_Tree(mid+1,r,a[rot1].r,a[rot2].r,loc,val);
	}
	else{
		a[rot2].r=a[rot1].r;
		a[rot2].l=++tot;
		New_Tree(l,mid,a[rot1].l,a[rot2].l,loc,val);
	}
}
int find(int rot1,int l,int r,int loc){
	int mid=l+r>>1;
	if(l==r){
		return rot1;
	}
	if(loc>mid){
		return find(a[rot1].r,mid+1,r,loc);
	}
	else{
		return find(a[rot1].l,l,mid,loc);
	}
}
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);
			if(rot[v]==0){
				rot[v]=++tot;
				New_Tree(1,n,rot[v-1],rot[v],loc,val);
			}
			else{
				a[find(rot[v],1,n,loc)].w=val;
			}
		}
		else{
			printf("%d\n",a[find(rot[v],i,n,loc)].w);
		}
	}
	return 0;
}
2024/7/15 15:22
加载中...