求调 悬关
查看原帖
求调 悬关
772368
Wind_love楼主2023/11/24 13:03

主席树求调

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long ans;
long long k;
long long bb,loc,val,tot=0;
long long rt,mode,x,y;
long long o;
long long a[2300005],t[2300005];
long long top=0;
struct node{
	long long l,r,date;
}tree[41151400];
long long build(long long p,long long l,long long r){
	p=++top;
	if(l==r){
		tree[p].date=a[l];
		return p;
	}
	long long mid=(l+r)>>1;
	tree[p].l=build(tree[p].l,l,mid);
	tree[p].r=build(tree[p].r,mid+1,r);
	return p;
}
long long update(long long rt,long long l,long long r,long long k,long long val){
	top++;
	tree[top]=tree[rt];
	rt=top;
	if(l==r){
		tree[rt].date=val;
		return rt;
	}
	else{
		long long mid=(l+r)>>1;
		if(k<=mid)tree[rt].l=update(tree[rt].l,l,mid,k,val);
		else tree[rt].l=update(tree[rt].r,mid+1,r,k,val);
	}
	return rt;
}
long long ask(long long p,long long l,long long r,long long k){
	if(l==r){
		return tree[p].date;
	}
	else{
		long long mid=(l+r)>>1;
		if(k<=mid) return ask(tree[p].l,l,mid,k);
		else return ask(tree[p].r,mid+1,r,k);
	}
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++) scanf("%lld",&a[i]);
	t[0]=build(0,1,n);
	for(long long i=1;i<=m;i++){
		scanf("%lld%lld",&bb,&o);
		if(o==1){
			scanf("%lld%lld",&loc,&val);
			t[i]=update(t[bb],1,n,loc,val);
		}
		else{
			scanf("%lld",&loc);
			printf("%lld\n",ask(t[bb],1,n,loc));
			t[i]=t[bb];
		}
	}
	return 0;
}
2023/11/24 13:03
加载中...