我的可持久化线段树怎么出现了看不懂的错误?
查看原帖
我的可持久化线段树怎么出现了看不懂的错误?
508032
int08楼主2024/1/5 21:01

RT

大数据就炸了

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
	int l,r,lson,rson,val;
}t[24000001];
int a[1234657],cnt;
void build(int l,int r,int o)
{
//	cerr<<o<<" "<<l<<" "<<r<<endl;
	t[o].l=l;t[o].r=r;
	if(l==r)
	{
		cnt=max(cnt,o);
		t[o].val=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,o*2);
	build(mid+1,r,o*2+1);
	t[o].lson=o*2;
	t[o].rson=o*2+1;
}
void newn(int tl,int tr,int ls,int rs,int v)
{
	cnt++;
	t[cnt]={tl,tr,ls,rs,v};
}
void change(int x,int o,int v)
{
	if(t[o].l==t[o].r)
	{
		newn(t[o].l,t[o].r,0,0,v);
		return;
	}
	int mid=(t[o].l+t[o].r)/2;
	if(x>mid)
	{
		change(x,t[o].rson,v);
		newn(t[o].l,t[o].r,t[o].lson,cnt,0);
	}
	else
	{
		change(x,t[o].lson,v);
		newn(t[o].l,t[o].r,cnt,t[o].rson,0);
	}
}
int ask(int x,int o)
{
//	cerr<<o<<" ";
	if(t[o].l==t[o].r) 
	{
//		cerr<<o<<endl;
		return t[o].val;
	}
	int mid=(t[o].l+t[o].r)/2;
	if(x>mid) return ask(x,t[o].rson);
	else return ask(x,t[o].lson);
}
int n,m,i,j,rt[1919810],rtc,op,ver,loc,v;
signed main()
{
//	freopen("P3939_6.in","r",stdin);
	scanf("%lld%lld",&n,&m);
	for(i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	build(1,n,1);
	rt[0]=1;
	for(i=1;i<=m;i++)
	{
//		cerr<<"o!\n";
		scanf("%lld%lld%lld",&ver,&op,&loc);
		if(op==1)
		{
			scanf("%lld",&v);
			change(loc,rt[ver],v);
			
//			cerr<<rtc<<"????"<<cnt<<endl;
		}
		if(op==2)
		{
//			cerr<<"o!\n";
			cout<<ask(loc,rt[ver])<<endl;
//			cerr<<endl;
		}
		rt[i]=cnt;
	}
	return 0;
}
2024/1/5 21:01
加载中...