可持久化线段树求调,P3919
  • 板块灌水区
  • 楼主Old_Guy
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/24 20:22
  • 上次更新2023/10/23 20:40:35
查看原帖
可持久化线段树求调,P3919
670214
Old_Guy楼主2023/3/24 20:22

Task0 第二个点Wa了

想下载数据,显示数据过大无法下载

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,key,opt,x,y,tot,a[N],root[N];
struct abc{
	int v,l,r;
}tree[20*N];
void makenew(int key){tree[++tot]=tree[key];}
int buildtree(int key,int l,int r){
	key=++tot;
	if(l==r){
		tree[key].v=a[l];
		return key;
	}
	int mid=(l+r)/2;
	tree[key].l=buildtree(key,l,mid);
	tree[key].r=buildtree(key,mid+1,r);
	return key;
}
int change(int l,int r,int key){
	makenew(key),key=tot;
	if(l==r) tree[key].v=y;
	else{
		int mid=(l+r)/2;
		if(mid>=x) tree[key].l=change(l,mid,tree[key].l);
		else tree[key].r=change(mid+1,r,tree[key].r);
	}
	return key;
}
int ask(int l,int r,int key){
	if(l==r) return tree[key].v;
	else{
		int mid=(l+r)/2;
		if(mid>=x) return ask(l,mid,tree[key].l);
		else return ask(mid+1,r,tree[key].r);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	root[0]=buildtree(0,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&key,&opt,&x);
		if(opt==1){
			scanf("%d",&y);
			root[i]=change(1,n,root[key]);
		}
		else{
			printf("%d\n",ask(1,n,root[key]));
			root[i]=root[key];
		}
	}
}
2023/3/24 20:22
加载中...