可持久化FHQ样例MLE求调
查看原帖
可持久化FHQ样例MLE求调
530468
_determination_楼主2024/1/17 18:50
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define debug puts("IAKIOI")
#define inf (int)1e18
using namespace std;
struct Treap{
	int val,siz,ls,rs,key,rev,sum;
}t[10000010];
int tot,root[200010];
mt19937 rnd(998244353);
int new_node(int x)
{
	t[++tot].val=x;
	t[tot].siz=1;
	t[tot].ls=t[tot].rs=0;
	t[tot].key=rnd();
    t[tot].sum=x;
	return tot;
}
void pu(int x)
{
	t[x].siz=1+t[t[x].ls].siz+t[t[x].rs].siz;
    t[x].sum=t[t[x].ls].sum+t[t[x].rs].sum+t[x].val;
}
void pd(int x)
{
    if(t[x].rev)
    {
        t[++tot]=t[t[x].ls];
        t[x].ls=tot;
        t[++tot]=t[t[x].rs];
        t[x].rs=tot;
        swap(t[x].ls,t[x].rs);
        t[t[x].ls].rev^=1;
        t[t[x].rs].rev^=1;
        t[x].rev=0;
    }
}
void split_k(int x,int rk,int &l,int &r)
{
	if(!x)
	{
		l=r=0;
		return;
	}
    int node=++tot;
    t[node]=t[x];
    pd(node);
	if(t[t[x].ls].siz+1<=rk)
	{
		l=node;
		split_k(t[node].rs,rk-t[t[x].ls].siz-1,t[node].rs,r);
	}else{
		r=node;
		split_k(t[node].ls,rk,l,t[node].ls);
	}
	pu(node);
}
int merge(int l,int r)
{
	if(!l||!r)
	{
		return l+r;
	}
    int node=++tot;
	if(t[l].key<t[r].key)
    {
        t[node]=t[l];
        pd(node);
		t[node].rs=merge(t[node].rs,r);
	}else{
        t[node]=t[r];
        pd(node);
		t[node].ls=merge(l,t[node].ls);
    }
    pu(node);
    return node;
}
signed main()
{
	int q;
	cin >> q;
    int lstans=0;
    for ( int i = 1 ; i <= q ; i++ )
    {
        int bb,op,l,r;
        cin >> bb >> op;
        root[i]=root[bb];
        int L,R,M;
        if(op==1)
        {
            cin >> l >> r;
            l^=lstans;
            r^=lstans;
            if(t[root[i]].siz==0)
            {
                root[i]=new_node(r);
                continue;
            }
            split_k(root[i],l,L,R);
            root[i]=merge(merge(L,new_node(r)),R);
        }else if(op==2)
        {
            cin >> l;
            l^=lstans;
            split_k(root[i],l,L,R);
            split_k(L,t[L].siz-1,L,M);
            root[i]=merge(L,R);
        }else if(op==3)
        {
            cin >> l >> r;
            l^=lstans;
            r^=lstans;
            split_k(root[i],r,L,R);
            split_k(L,l-1,L,M);
            t[M].rev=1;
            root[i]=merge(merge(L,M),R);
        }else {
            cin >> l >> r;
            l^=lstans;
            r^=lstans;
            split_k(root[i],r,L,R);
            split_k(L,l-1,L,M);
            cout << t[M].sum << endl;
            lstans=t[M].sum;
            root[i]=merge(merge(L,M),R);
        }
    }
	return 0;
}
2024/1/17 18:50
加载中...