求助随机输出错误答案。主要是第一问的原因,后面直接 RE。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
using std::cin;using std::cout;
constexpr int N=300005,M=5000005,p=1e9+7;
int n,q,f[N],op,b,c,d,e,cnt,root,ans,r1,r2,r3,r4,r5,tot;
struct Treap{
struct A{int ls,rs,siz,val,sum,t1,t2,rd;bool rev;}a[M];
inline int newnode(int v){
a[++cnt].val=v;a[cnt].sum=v;a[cnt].t1=-1;a[cnt].siz=1;a[cnt].rd=rand();
a[cnt].ls=a[cnt].rs=a[cnt].t2=a[cnt].rev=0;return cnt;
}
inline int copy(int x){a[++cnt]=a[x];return cnt;}
inline void pushup(int p){
a[p].siz=a[a[p].ls].siz+a[a[p].rs].siz+1;
a[p].sum=((a[a[p].ls].sum+a[a[p].rs].sum)%p+a[p].val)%p;
}
inline void pushdown(int p){
if(a[p].t1==-1&&!a[p].t2&&!a[p].rev) return ;
if(a[p].ls) a[p].ls=copy(a[p].ls);
if(a[p].rs) a[p].rs=copy(a[p].rs);
if(a[p].rev){
std::swap(a[p].ls,a[p].rs);
if(a[p].ls) a[a[p].ls].rev^=1;
if(a[p].rs) a[a[p].rs].rev^=1;a[p].rev=0;
}
if(a[p].t1!=-1){
if(a[p].ls){
a[a[p].ls].val=a[a[p].ls].t1=a[p].t1;a[a[p].ls].t2=0;
a[a[p].ls].sum=1ll*a[p].t1*a[a[p].ls].siz%p;
}
if(a[p].rs){
a[a[p].rs].val=a[a[p].rs].t1=a[p].t1;a[a[p].rs].t2=0;
a[a[p].rs].sum=1ll*a[p].t1*a[a[p].rs].siz%p;
}
a[p].t1=-1;
}
if(a[p].t2){
if(a[p].ls){
a[a[p].ls].val=(a[a[p].ls].val+a[p].t2)%p;a[a[p].ls].t2=(a[a[p].ls].t2+a[p].t2)%p;
a[a[p].ls].sum=(a[a[p].ls].sum+1ll*a[p].t2*a[a[p].ls].siz%p)%p;
}
if(a[p].rs){
a[a[p].rs].val=(a[a[p].rs].val+a[p].t2)%p;a[a[p].rs].t2=(a[a[p].rs].t2+a[p].t2)%p;
a[a[p].rs].sum=(a[a[p].rs].sum+1ll*a[p].t2*a[a[p].rs].siz%p)%p;
}
a[p].t2=0;
}
}
inline void split(int p,int k,int &x,int &y){
if(!p){x=y=0;return ;}
pushdown(p);
if(k<=a[a[p].ls].siz){y=copy(p);split(a[y].ls,k,x,a[y].ls);pushup(y);}
else{x=copy(p);split(a[x].rs,k-a[a[x].ls].siz-1,a[x].rs,y);pushup(x);}
}
inline int merge(int x,int y){
if(!x||!y) return x|y;
if(a[x].rd<a[y].rd){x=copy(x);pushdown(x);a[x].rs=merge(a[x].rs,y);pushup(x);return x;}
y=copy(y);pushdown(y);a[y].ls=merge(x,a[y].ls);pushup(y);return y;
}
inline void cover(int p,int k){
a[p].val=a[p].t1=k;a[p].t2=0;
a[p].sum=1ll*a[p].siz*k%p;
}
inline void add(int p,int k){
a[p].val=(a[p].val+k)%p;a[p].t2=(a[p].t2+k)%p;
a[p].sum=(a[p].sum+1ll*a[p].siz*k%p)%p;
}
inline void down(int p){
//printf("%d,%d\n",cnt,p);
if(!p) return ;
pushdown(p);
if(a[p].ls) down(a[p].ls);
f[++tot]=a[p].val;
if(a[p].rs) down(a[p].rs);
}
}treap;
signed main(){
freopen("P5586_1.in","r",stdin);
freopen("P5586.out","w",stdout);
std::ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>q;srand(time(0));
for(int i=1;i<=n;++i){cin>>f[i];root=treap.merge(root,treap.newnode(f[i]));}
for(int i=1;i<=q;++i){
cin>>op>>b>>c;b^=ans;c^=ans;
if(op==1){
treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
cout<<(ans=treap.a[r2].sum)<<'\n';root=treap.merge(r1,treap.merge(r2,r3));
}
if(op==2){
cin>>d;d^=ans;treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
r2=treap.copy(r2);treap.cover(r2,d);root=treap.merge(r1,treap.merge(r2,r3));
}
if(op==3){
cin>>d;d^=ans;treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
r2=treap.copy(r2);treap.add(r2,d);root=treap.merge(r1,treap.merge(r2,r3));
}
if(op==4){
bool tag=0;cin>>d>>e;d^=ans;e^=ans;
if(b>d){tag=1;std::swap(b,d);std::swap(c,e);}
treap.split(root,e,r1,r5);treap.split(r1,d-1,r1,r4);
treap.split(r1,c,r1,r3);treap.split(r1,b-1,r1,r2);
if(tag) root=treap.merge(r1,treap.merge(r4,treap.merge(r3,treap.merge(r4,r5))));
else root=treap.merge(r1,treap.merge(r2,treap.merge(r3,treap.merge(r2,r5))));
}
if(op==5){
cin>>d>>e;d^=ans;e^=ans;
if(b>d){std::swap(b,d);std::swap(c,e);}
treap.split(root,e,r1,r5);treap.split(r1,d-1,r1,r4);
treap.split(r1,c,r1,r3);treap.split(r1,b-1,r1,r2);
root=treap.merge(r1,treap.merge(r4,treap.merge(r3,treap.merge(r2,r5))));
}
if(op==6){
treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
r2=treap.copy(r2);treap.a[r2].rev^=1;root=treap.merge(r1,treap.merge(r2,r3));
}
// if(i<=9){
// cout<<op<<' '<<b<<' '<<c<<' ';
// if(2<=op&&op<=5) cout<<d<<' ';
// if(4<=op&&op<=5) cout<<e<<' ';
// cout<<'\n';
// }
if(cnt>=12*N){
tot=0;treap.down(root);cnt=root=0;
for(int j=1;j<=n;++j) root=treap.merge(root,treap.newnode(f[j]));
}
//printf("cnt:%d\n",cnt);
//for(int i=1;i<=n;++i) cout<<f[i]<<' ';cout<<'\n';
}
tot=0;treap.down(root);
for(int i=1;i<=n;++i) cout<<f[i]<<' ';
std::cerr<<1.0*clock()/CLOCKS_PER_SEC;
return 0;
}