全部MLE了QaQ
#include<bits/stdc++.h>
using namespace std;
int n,m,a[300005];
const long long Mod=1e9+7;
struct node{
int l,r;
mutable long long val;
friend bool operator<(node a,node b){
return a.l<b.l;
}
};
set<node>odt;
auto split(int p){
auto itr=odt.lower_bound({p,p,0});
if(itr!=odt.end()&&itr->l==p)
return itr;//左闭右开
itr--;
int l=itr->l,r=itr->r;
long long val=itr->val;
odt.erase(itr);
odt.insert({l,p-1,val});
return odt.insert({p,r,val}).first;
}
void assign(int l,int r,long long x){
auto itr=split(r+1),itl=split(l);
odt.erase(itl,itr);//左闭右开。
odt.insert({l,r,x});
}
void Plus(int l,int r,long long x){
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
it->val=(it->val+x)%Mod;
}
void copy(int l,int r,int x,int y){
auto itr=split(r+1),itl=split(l);
auto ity=split(y+1),itx=split(x);
odt.erase(itx,ity);
for(auto it=itl;it!=itr;it++)
odt.insert({it->l-l+x,it->r-l+x,it->val});
}
void trans(int l,int r,int x,int y){
if(l>x){
swap(l,x);
swap(r,y);
}
auto itr=split(r+1),itl=split(l);
auto ity=split(y+1),itx=split(x);
vector<node>va,vb;
for(auto it=itl;it!=itr;it++)
va.push_back(*it);
for(auto it=itx;it!=ity;it++)
vb.push_back(*it);
odt.erase(itl,itr);
odt.erase(itx,ity);
for(int i=0;i<va.size();i++)
odt.insert({va[i].l-l+x,va[i].r-l+x,va[i].val});
for(int i=0;i<vb.size();i++)
odt.insert({vb[i].l-x+l,vb[i].r-x+l,vb[i].val});
}
void Poly(int l,int r){
auto itr=split(r+1),itl=split(l);
vector<node>va;
for(auto it=itl;it!=itr;it++)
va.push_back(*it);
odt.erase(itl,itr);
for(int i=va.size()-1;i>=0;i--){
odt.insert({l,l+(va[i].r-va[i].l),va[i].val});
l+=va[i].r-va[i].l+1;
}
}
long long sum(int l,int r){
long long res=0;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
res=(res+it->val*(it->r-it->l+1)%Mod)%Mod;
return res;
}
void output(int l,int r){
auto itr=odt.end(),itl=odt.begin();
for(auto it=itl;it!=itr;it++){
for(int i=1;i<=it->r-it->l+1;i++)
printf("%lld ",it->val%Mod);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
odt.insert({i,i,a[i]});
}
// for(int i=1,r=i;i<=n;i=r+1){
// while(r<n&&a[r+1]==a[i])
// r++;
// odt.insert({i,r,a[i]});
// }
for(int i=1;i<=m;i++){
int op,l,r,x,y;
scanf("%d",&op);
if(op==1){
scanf("%d%d",&l,&r);
cout<<sum(l,r)<<'\n';
}
if(op==2){
scanf("%d%d%d",&l,&r,&x);
assign(l,r,x);
}
if(op==3){
scanf("%d%d%d",&l,&r,&x);
Plus(l,r,x);
}
if(op==4){
scanf("%d%d%d%d",&l,&r,&x,&y);
copy(l,r,x,y);
}
if(op==5){
scanf("%d%d%d%d",&l,&r,&x,&y);
trans(l,r,x,y);
}
if(op==6){
scanf("%d%d",&l,&r);
Poly(l,r);
}
}
output(1,n);
}