不知道为什么会MLE
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=1e9+7;
struct Node{
int ls,rs;
int x,p;
int size,sum;
int tag_add,tag_change,tag_flip;
}t[600010];
int cnt,root,n,m;
int newNode(int x){
cnt++;
t[cnt].ls=0;
t[cnt].rs=0;
t[cnt].x=x;
t[cnt].p=rand();
t[cnt].size=1;
t[cnt].sum=x;
t[cnt].tag_add=0;
t[cnt].tag_change=-1;
t[cnt].tag_flip=0;
return cnt;
}
int copyNode(int u){
cnt++;
t[cnt].ls=t[u].ls;
t[cnt].rs=t[u].rs;
t[cnt].x=t[u].x;
t[cnt].p=t[u].p;
t[cnt].size=t[u].size;
t[cnt].sum=t[u].sum;
t[cnt].tag_add=t[u].tag_add;
t[cnt].tag_change=t[u].tag_change;
t[cnt].tag_flip=t[u].tag_flip;
return cnt;
}
void Updata(int u){
t[u].size=t[t[u].ls].size+1+t[t[u].rs].size;
t[u].sum=t[t[u].ls].sum+t[u].x+t[t[u].rs].sum;
}
void addtag(int u,int x){
t[u].x=(t[u].x+x)%M;
t[u].sum=(t[u].sum+t[u].size*x%M)%M;
t[u].tag_add=(t[u].tag_add+x)%M;
}
void changetag(int u,int x){
t[u].x=x;
t[u].sum=t[u].size*x%M;
t[u].tag_change=x;
t[u].tag_add=0;
// t[u].tag_flip=0;
}
void fliptag(int u){
t[u].tag_flip^=1;
}
void push_down(int u){
if(t[u].tag_change!=-1){
changetag(t[u].ls,t[u].tag_change);
changetag(t[u].rs,t[u].tag_change);
t[u].tag_change=-1;
}
if(t[u].tag_add){
addtag(t[u].ls,t[u].tag_add);
addtag(t[u].rs,t[u].tag_add);
t[u].tag_add=0;
}
if(t[u].tag_flip){
swap(t[u].ls,t[u].rs);
fliptag(t[u].ls);
fliptag(t[u].rs);
t[u].tag_flip=0;
}
}
void Spilt(int u,int k,int &L,int &R){
if(u==0){
L=R=0;
return;
}
push_down(u);
if(t[t[u].ls].size+1<=k){
L=u;
Spilt(t[u].rs,k-t[t[u].ls].size-1,t[u].rs,R);
}
else{
R=u;
Spilt(t[u].ls,k,L,t[u].ls);
}
Updata(u);
}
int Merge(int L,int R){
if(!L||!R) return L+R;
if(t[L].p<t[R].p){
push_down(L);
t[L].rs=Merge(t[L].rs,R);
Updata(L);
return L;
}
else{
push_down(R);
t[R].ls=Merge(L,t[R].ls);
Updata(R);
return R;
}
}
void out(int u){
if(!u) return;
push_down(u);
out(t[u].ls);
cout<<t[u].x%M<<" ";
out(t[u].rs);
Updata(u);
return;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
int a,L,R;
cin>>a;
Spilt(root,cnt,L,R);
root=Merge(Merge(L,newNode(a)),R);
}
while(m--){
int op;
int l,r,ll,rr;
int L,p1,mid,p2,R;
int d;
cin>>op;
if(op==1){
cin>>l>>r;
Spilt(root,r,L,R);
Spilt(L,l-1,L,mid);
cout<<t[mid].sum%M<<"\n";
root=Merge(Merge(L,mid),R);
}
if(op==2){
cin>>l>>r>>d;
Spilt(root,r,L,R);
Spilt(L,l-1,L,mid);
changetag(mid,d);
// cout<<mid<<"\n";
root=Merge(Merge(L,mid),R);
}
if(op==3){
cin>>l>>r>>d;
Spilt(root,r,L,R);
Spilt(L,l-1,L,mid);
addtag(mid,d);
root=Merge(Merge(L,mid),R);
}
if(op==4){
cin>>l>>r>>ll>>rr;
int f=0;
if(l>ll){
f=1;
swap(l,ll);swap(r,rr);
}
Spilt(root,rr,L,R);
Spilt(L,ll-1,L,p2);
Spilt(L,r,L,mid);
Spilt(L,l-1,L,p1);
if(f) p1=copyNode(p2);
else p2=copyNode(p1);
root=Merge(Merge(Merge(Merge(L,p1),mid),p2),R);
}
if(op==5){
cin>>l>>r>>ll>>rr;
if(l>ll){
swap(l,ll),swap(r,rr);
}
Spilt(root,rr,L,R);
Spilt(L,ll-1,L,p2);
Spilt(L,r,L,mid);
Spilt(L,l-1,L,p1);
root=Merge(Merge(Merge(Merge(L,p2),mid),p1),R);
}
if(op==6){
cin>>l>>r;
Spilt(root,r,L,R);
Spilt(L,l-1,L,mid);
fliptag(mid);
root=Merge(Merge(L,mid),R);
}
// out(root);
// cout<<"\n";
}
out(root);
return 0;
}