写的fhqtreap,稍微有点离谱,见谅/kk
#include<stdio.h>
inline int rand(){static int seed=2333;return seed=seed*5%999983;}
const int maxn=100001;
struct{int k,lc,rc,f,sz,v;long long sum;}node[maxn];
inline void pushup(int x){node[node[x].lc].f=x,node[node[x].rc].f=x;node[x].sz=node[node[x].lc].sz+node[node[x].rc].sz+1,node[x].sum=node[node[x].lc].sum+node[node[x].rc].sum+node[x].v;}
int merge(int a,int b){
if(!a||!b)return 0;
if(node[a].k>node[b].k)return merge(node[a].rc,b),pushup(a),a;
else return merge(a,node[b].lc),pushup(b),b;
}
void split(int x){
int y=x;
for(;node[y].f&&node[node[y].f].lc==y;y=node[y].f);
if(node[x].lc)node[node[x].lc].f=node[y].f;
if(node[y].f)node[node[y].f].rc=node[x].lc;
node[y].f=0,node[x].lc=0;
}
int findroot(int x){
int y=x;
for(;node[y].f;y=node[y].f);
return y;
}
int nxt(int x){
if(node[x].rc){int y=node[x].rc;for(;node[y].lc;y=node[y].lc);return y;}
else{int y=x;for(;y&&node[node[y].f].rc==y;y=node[y].f);return node[y].f;}
}
int pre(int x){
if(node[x].lc){int y=node[x].lc;for(;node[y].rc;y=node[y].rc);return y;}
else{int y=x;for(;y&&node[node[y].f].lc==y;y=node[y].f);return node[y].f;}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
node[i]={rand(),0,0,0,1};
scanf("%d",&node[i].v);node[i].sum=node[i].x;
}
int x,y,z,a,b,c;
for(;m--;){
char c=(getchar(),getchar());
switch(c){
case 'M':scanf("%d%d",&x,&y);if(findroot(x)!=findroot(y))merge(findroot(x),findroot(y));break;
case 'D':scanf("%d",&x);split(x);break;
default:
scanf("%d%d",&x,&y);
if(findroot(x)!=findroot(y)){puts("-1");break;}
y=nxt(y),z=pre(x);split(x);if(y)split(y);
a=findroot(z),b=findroot(x),c=findroot(y);
printf("%d\n",node[b].sum);
merge(merge(a,b),c);
}
}
return 0;
}
貌似是 merge
的问题,样例最后一行输出 -1
/jk