求问,为什么样例不过(悬关)
查看原帖
求问,为什么样例不过(悬关)
920406
违规用户名920406楼主2024/12/6 14:12

rt,可持久化线段树

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+1;
int n,m,top,op,x,y,z,a[N],r[N];
struct{int ls,rs,x;} t[N];
inline int clone(int p)
{
	t[++top]=t[p];
	return top;
}
int bulid(int l,int r)
{
    int p=++top;
    if(l==r)
    {
        t[p].x=a[l];
        return p;//
    }
    int m=l+r>>1;
    t[p].ls=bulid(l,m);
    t[p].rs=bulid(m+1,r);
    return p;
}
int update(int p,int l,int r,int x,int y)
{
	int P=clone(p);
	if(l==r)	t[P].x=x;
	else
	{
		int m=l+r>>1;
		if(x<=m)	t[P].ls=update(t[P].ls,l,m,x,y);
		else	t[P].rs=update(t[P].rs,m+1,r,x,y);
	}
	return P;
}
int query(int p,int l,int r,int x)
{
	if(l==r)	return t[p].x;
	int m=l+r>>1;
	if(x<=m)	return query(t[p].ls,l,m,x);
	return query(t[p].rs,m+1,r,x);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)   cin>>a[i];
    r[0]=bulid(1,n);
    for(int i=1;i<=m;i++)
    {
    	cin>>x>>op;
    	if(op==1)
    	{
    		cin>>y>>z;
    		r[i]=update(r[x],1,n,y,z);
		}
    	else
		{
    		cin>>y;
    		cout<<query(r[x],1,n,y)<<'\n';
    		r[i]=r[x];
		}
	}
    return 0;
}
2024/12/6 14:12
加载中...