这题,链表全部RE,debug 0.5h 无果...
#include <iostream>
#include <cstdio>
#define mod 1000000007
using namespace std;
int n,m,tot,opt,x,y,z,a[1000005],size[1000005],tag[1000005],first[1000005],_end[1000005],nxt[1000005],pre[1000005];
int main(){
freopen("problem2.in","r",stdin);
freopen("problem2.out","w",stdout);
cin>>n>>m;
for (int i=1;i<=m;i++){
scanf("%d",&opt);
if (opt==1){
scanf("%d%d",&x,&y);
size[x]++;
if (first[x]==0){
++tot;
a[tot]=y;
first[x]=tot,_end[x]=tot;
}
else{
++tot;
a[tot]=y;
int fi=first[x];
first[x]=tot;
nxt[first[x]]=fi,pre[fi]=first[x];
}
}
if (opt==2){
scanf("%d",&x);
size[x]--;
printf("%d\n",(a[first[x]]+tag[x])%mod);
int fi=first[x];
first[x]=nxt[fi];
pre[first[x]]=0;
pre[fi]=nxt[fi]=0;
if (first[x]==0)_end[x]=0;
}
if (opt==3){
scanf("%d%d",&x,&y);
size[x]++;
if (_end[x]==0){
++tot;
a[tot]=y;
_end[x]=tot,first[x]=tot;
}
else{
++tot;
a[tot]=y;
int en=_end[x];
_end[x]=tot;
pre[_end[x]]=en,nxt[en]=_end[x];
}
}
if (opt==4){
scanf("%d",&x);
if (size[x]==0)continue;
size[x]--;
printf("%d\n",(a[_end[x]]+tag[x])%mod);
int en=_end[x];
_end[x]=pre[en];
nxt[_end[x]]=0;
pre[en]=nxt[en]=0;
if (_end[x]==0)first[x]=0;
}
if (opt==5){
scanf("%d%d",&x,&y);
tag[x]+=y;
tag[x]%=mod;
}
if (opt==6){
scanf("%d%d",&x,&y);
if (size[x]<size[y]){
int delta=tag[y]-tag[x];
tag[x]=tag[y];
for (int j=first[x];j;j=nxt[j])
a[j]-=delta,a[j]=(a[j]+mod)%mod;
}
else{
int delta=tag[x]-tag[y];
tag[y]=tag[x];
for (int j=first[y];j;j=nxt[j])
a[j]-=delta,a[j]=(a[j]+mod)%mod;
}
if (first[x]==0){
first[x]=first[y];
_end[x]=_end[y];
}
else nxt[_end[x]]=first[y],pre[first[y]]=_end[x];
size[x]+=size[y];
first[y]=_end[y]=size[y]=tag[y]=0;
}
}
return 0;
}