尝试用讨论区的一个数据生成器和题解对拍过,没拍出错,但是提交就是测试点1~7WA,8,9,10TLE。
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
const int mod=1e9+7;
struct FHQtree{
int ls,rs;
int pri;
int siz,v,sum,add,val,cpy,swp;
}t[N];
int sta[N+5],head;
int cnt,root;
inline int newnode(int x){
cnt=sta[head--];
t[cnt].siz=1;
t[cnt].ls=t[cnt].rs=0;
t[cnt].v=x,t[cnt].sum=x;
t[cnt].val=-1,t[cnt].add=t[cnt].cpy=t[cnt].swp=0;
t[cnt].pri=rand();
return cnt;
}
inline int copy(int u){
newnode(0);
t[cnt]=t[u];
return cnt;
}
inline void pushdown(int u){
if(t[u].cpy){
if(t[u].ls)t[u].ls=copy(t[u].ls),t[t[u].ls].cpy=1;
if(t[u].rs)t[u].rs=copy(t[u].rs),t[t[u].rs].cpy=1;
t[u].cpy=0;
}
if(t[u].swp){
swap(t[u].ls,t[u].rs);
if(t[u].ls)t[t[u].ls].swp^=1;
if(t[u].rs)t[t[u].rs].swp^=1;
t[u].swp=0;
}
if(t[u].val!=-1){
if(t[u].ls){
t[t[u].ls].sum=(1ll*t[t[u].ls].siz*t[u].val)%mod;
t[t[u].ls].val=t[u].val%mod;
t[t[u].ls].add=0;
t[t[u].ls].v=t[u].val%mod;
}
if(t[u].rs){
t[t[u].rs].sum=(1ll*t[t[u].rs].siz*t[u].val)%mod;
t[t[u].rs].val=t[u].val%mod;
t[t[u].rs].add=0;
t[t[u].rs].v=t[u].val%mod;
}
t[u].val=-1;
}
if(t[u].add){
if(t[u].ls){
t[t[u].ls].sum=(1ll*t[t[u].ls].sum+t[t[u].ls].siz*t[u].add)%mod;
t[t[u].ls].v=(1ll*t[t[u].ls].v+t[u].add)%mod;
if(t[t[u].ls].val==-1)t[t[u].ls].add=(1ll*t[t[u].ls].add+t[u].add)%mod;
else t[t[u].ls].val=(1ll*t[t[u].ls].val+t[u].add)%mod;
}
if(t[u].rs){
t[t[u].rs].sum=(1ll*t[t[u].rs].sum+t[t[u].rs].siz*t[u].add)%mod;
t[t[u].rs].v=(1ll*t[t[u].rs].v+t[u].add)%mod;
if(t[t[u].rs].val==-1)t[t[u].rs].add=(1ll*t[t[u].rs].add+t[u].add)%mod;
else t[t[u].rs].val=(1ll*t[t[u].rs].val+t[u].add)%mod;
}
t[u].add=0;
}
}
inline void update(int u){
t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
t[u].sum=(t[t[u].ls].sum+t[t[u].rs].sum+t[u].v)%mod;
}
inline void split(int u,int x,int &L,int &R){
if(u==0){L=R=0;return;}
pushdown(u);
if(t[t[u].ls].siz+1<=x)L=u,split(t[u].rs,x-t[t[u].ls].siz-1,t[u].rs,R);
else R=u,split(t[u].ls,x,L,t[u].ls);
update(u);
}
inline int merge(int L,int R){
if(!L||!R)return L+R;
pushdown(L),pushdown(R);
if(t[L].pri>t[R].pri){t[L].rs=merge(t[L].rs,R),update(L);return L;}
else {t[R].ls=merge(L,t[R].ls),update(R);return R;}
}
inline void inord(int u){
if(u==0)return ;
pushdown(u);
inord(t[u].ls);
cout<<t[u].v%mod<<" ";
inord(t[u].rs);
}
int n,m,x,mini,val,ans,now,f[N];
inline void dfs(int u){
if(!u)return ;
pushdown(u);
f[u]=1;
dfs(t[u].ls);
dfs(t[u].rs);
}
inline void cle(){
dfs(root);
head=0;
for(int i=N;i>=1;--i){
if(!f[i])sta[++head]=i;
f[i]=0;
}
}
int main(){
srand(time(NULL));
// freopen("p5350.in","r",stdin);
// freopen("p5350.out","w",stdout);
head=0;
for(int i=N;i>=1;--i)sta[++head]=i;
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>x;
root=merge(root,newnode(x));
}
for(int i=1;i<=m;++i){
int opt,l1,r1,l2,r2,x,L,R,M,p1,p2;
cin>>opt;
if(opt==1){
cin>>l1>>r1;
split(root,r1,L,R);
split(L,l1-1,L,p1);
cout<<t[p1].sum%mod<<"\n";
root=merge(merge(L,p1),R);
}
if(opt==2){
cin>>l1>>r1>>x;
split(root,r1,L,R);
split(L,l1-1,L,p1);
t[p1].val=x;
t[p1].v=x;
t[p1].sum=(1ll*t[p1].siz*x)%mod;
t[p1].add=0;
root=merge(merge(L,p1),R);
}
if(opt==3){
cin>>l1>>r1>>x;
split(root,r1,L,R);
split(L,l1-1,L,p1);
t[p1].v=(1ll*t[p1].v+x)%mod;
t[p1].sum=(1ll*t[p1].sum+t[p1].siz*x)%mod;
if(t[p1].val==-1)t[p1].add=(1ll*t[p1].add+x)%mod;
else t[p1].val=(1ll*t[p1].val+x)%mod;
root=merge(merge(L,p1),R);
}
if(opt==4){
cin>>l1>>r1>>l2>>r2;
split(root,max(r1,r2),L,R);
split(L,max(l1,l2)-1,L,p2);
split(L,min(r1,r2),L,M);
split(L,min(l1,l2)-1,L,p1);
if(l1<l2)t[p2]=t[p1];
if(l1>l2)t[p1]=t[p2];
t[p2].cpy=1;
t[p1].cpy=1;
root=merge(merge(merge(merge(L,p1),M),p2),R);
}
if(opt==5){
cin>>l1>>r1>>l2>>r2;
if(l1>l2)swap(l1,l2),swap(r1,r2);
split(root,r2,L,R);
split(L,l2-1,L,p2);
split(L,r1,L,M);
split(L,l1-1,L,p1);
root=merge(merge(merge(merge(L,p2),M),p1),R);
}
if(opt==6){
cin>>l1>>r1;
split(root,r1,L,R);
split(L,l1-1,L,p1);
t[p1].swp^=1;
root=merge(merge(L,p1),R);
}
if(head<=n)cle();
}
inord(root);
return 0;
}