过大样例的sfw死不要脸的求助
#include<bits/stdc++.h>
#define ll long long
#define rr register
//#define inf 1000000000
#define N 500010
#define int ll
using namespace std;
inline int read()
{
rr int num=0;rr bool f=0;rr char ch=getchar();
while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+(ch^48),ch=getchar();
return f?-num:num;
}
std::mt19937 rnd(11451);
//
int n,m;
//
struct node{
int ls,rs,val,key;
int sum,fa;
int siz;
}tr[N];
int cntf,root;
inline int newnode(int val)
{
tr[++cntf].val=tr[cntf].sum=val;
tr[cntf].ls=tr[cntf].rs=tr[cntf].fa=0;
tr[cntf].siz=1;
tr[cntf].key=rnd();
//printf("%d %d\n",cntf,val);
return cntf;
}
inline void mt(int x)
{
tr[x].sum=tr[x].val+tr[tr[x].ls].sum+tr[tr[x].rs].sum;
tr[x].siz=tr[tr[x].ls].siz+tr[tr[x].rs].siz+1;
if(tr[x].ls)tr[tr[x].ls].fa=x;
if(tr[x].rs)tr[tr[x].rs].fa=x;
tr[x].fa=0;
}
inline void split(int now,int &x,int &y,int siz)
{
if(!now){x=y=0;return;}
if(tr[tr[now].ls].siz<siz)
x=now,split(tr[now].rs,tr[x].rs,y,siz-tr[tr[now].ls].siz-1);
else y=now,split(tr[now].ls,x,tr[y].ls,siz);
tr[x].fa=0,tr[y].fa=0;
mt(now);
}
inline int merge(int x,int y)
{
if(!x||!y) return x|y;
if(tr[x].key<tr[y].key)
{
tr[x].rs=merge(tr[x].rs,y),mt(x);
return x;
}tr[y].ls=merge(x,tr[y].ls),mt(y);
return y;
}
inline int find(int x)
{
while(tr[x].fa) x=tr[x].fa;
return x;
}
#define nroot(x) (tr[tr[x].fa].rs==x)
inline int findrk(int x)
{
rr int res=1+tr[tr[x].ls].siz;
while(x)
{
//printf("x%d\n",x);
if(nroot(x)) res+=tr[tr[tr[x].fa].ls].siz+1;
x=tr[x].fa;
}return res;
}
/*
inline void ldr(rr int x)
{
if(!x) return ;
//printf("stl%d ",x),
ldr(tr[x].ls);
//printf("endl%d ",x);
printf("%d ",tr[x].val);
//printf("str%d ",x),
ldr(tr[x].rs);
// printf("endr%d ",x);
}*/
inline void qry(int x,int y)
{
int rtx=find(x),rkx=findrk(x),rky=findrk(y),xx,yy,zz,res;
if(find(y)!=rtx){puts("-1");return;}
if(rkx>rky) swap(rkx,rky);
split(rtx,xx,yy,rkx-1);
split(yy,yy,zz,rky-rkx+1);
printf("%lld\n",tr[yy].sum);
merge(xx,merge(yy,zz));
}
inline void mee(int x,int y)
{
x=find(x),y=find(y);
if(x==y) return;
merge(y,x);
}
signed main()
{
n=read(),m=read();
for(rr int i=1;i<=n;i++) newnode(read());
while(m--)
{
rr char opt;cin>>opt;
rr int x=read(),y;
if(opt=='Q') y=read(),qry(x,y);
else if(opt=='M') y=read(),mee(x,y);
else if(opt=='D')
{
rr int rtx=find(x),rkx=findrk(x),emm,emmm;
//ldr(rtx);
//printf("rkk%d\n",siz);
split(rtx,emm,emmm,rkx-1);
}
}
}