求调,
  • 板块学术版
  • 楼主wuyue__X
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/24 18:26
  • 上次更新2024/4/24 20:50:25
查看原帖
求调,
782481
wuyue__X楼主2024/4/24 18:26

40分WA求调 P3919 【模板】可持久化线段树 1(可持久化数组)

#include<bits/stdc++.h>
#define WA AC 
//#define int  long long
#define maxn 5000031

using namespace std;
int n,m,a[1000005],l,r,t,k,tmp,x,y,s[1000005],cnt=1,cnt2=0;
struct node{
	int v,left,right;
}segtree[2000000*21];

void build(int l,int r,int rt){
	//segtree[rt].lzy=0;
	if(l==r){
		segtree[rt].v=a[l];
		segtree[rt].left=0;
		segtree[rt].right=0;
		return;
	}
	int m=(l+r)>>1;
	segtree[rt].left=++cnt;
	segtree[rt].right=++cnt;
	build(l,m,segtree[rt].left);
	build(m+1,r,segtree[rt].right);
}
//int query(int x,int l,int r,int rt){
//	if(x>r || y<l) return 0;
//	if(r<=y && x<=l){
//		return segtree[rt].v;
//	}
//	int m=(l+r)>>1;
//	//pushdown(m-l+1,r-m,rt);
//	return query(x,y,l,m,rt<<1)+query(x,y,m+1,r,rt<<1|1);
//}
void update(int x,int y,int l,int r,int rt,int rtt){
	if(l==r){
		segtree[rtt].v=y;
		return;
	}
	int m=(l+r)>>1;
	
	if(x<=m){
		segtree[rtt].left=++cnt;
		update(x,y,l,m,segtree[rt].left,segtree[rtt].left);
		segtree[rtt].right=segtree[rt].right;
		
	} 
	else{
		segtree[rtt].right=++cnt;
		update(x,y,m+1,r,segtree[rt].right,segtree[rtt].right);
		segtree[rtt].left=segtree[rt].left;
	}
	
}
int tofind(int x,int l,int r,int rt){
	if(l==r) return segtree[rt].v; 
	int m=(l+r)>>1;
	if(x<=m){
		return tofind(x,l,m,segtree[rt].left);
	} 
	else{
		return tofind(x,m+1,r,segtree[rt].right);
	}
}
void print(int rt){
	if(!rt) return;
	cout<<segtree[rt].v<<" ";
	print(segtree[rt].left);
	print(segtree[rt].right);
	
}
signed main(){
	s[0]=1;
	scanf("%d",&n);
	cin>>t;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,n,1);
	//print(1);
	
	for(int i=1;i<=t;i++){
		scanf("%d",&k);
		scanf("%d",&y);
		scanf("%d",&x);
		s[++cnt2]=++cnt;
		
		if(y==1){
			cin>>tmp;
			update(x,tmp,1,n,s[k],cnt);
			
		}
		else{
			segtree[cnt].right=segtree[s[cnt2-1]].right;
			segtree[cnt].left=segtree[s[cnt2-1]].left;
			int ans=tofind(x,1,n,s[k]);
			cout<<ans<<"\n";
		}
		//print(s[cnt2]);
	}
	
	
		
	return 0;
}
2024/4/24 18:26
加载中...