#include<bits/stdc++.h>
using namespace std;
int n,m;
/*struct node{
int l,r;
mutable int v;
node(int l,int r=0,int v=0):l(l),r(r),v(v) {}
bool operator <(const node &x) const
{
return l<x.l;
}
}a[500010],b[500010];*/
struct node
{
int l,r;
mutable long long v;
node(int L=0,int R=-1,int V=0):l(L),r(R),v(V){}
friend bool operator <(const node &a,const node &b){return a.l<b.l;}
// int len(){return r-l+1;}
};
node a[1000010],b[1000010];
set<node> s;
inline int read()
{
register int x=0,y=1;register char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')y=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*y;
}
set<node>::iterator split(int pos)
{
set<node>::iterator it=s.lower_bound(node(pos));
if(it->l==pos&&it!=s.end())
{
return it;
}
it--;
if(pos>it->r)
{
return s.end();
}
int l=it->l;
int r=it->r;
int v=it->v;
s.erase(it);
s.insert(node(l,pos,v));
return s.insert(node(pos+1,r,v)).first;
}
long long query(int l,int r)
{
set<node>::iterator itr=split(r+1),itl=split(l);
long long ans=0;
for(set<node>::iterator it=itl;it!=itr;it++)
{
ans=(ans+it->v*(it->r-it->l+1))%1000000007;
}
return ans;
}
void assign(int l,int r,long long x)
{
set<node>::iterator itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,x%1000000007));
return ;
}
void change(int l,int r,long long x)
{
set<node>::iterator itr=split(r+1),itl=split(l);
for(set<node>::iterator it=itl;it!=itr;it++)
{
it->v=(it->v+x)%1000000007;
}
return ;
}
void rcopy(int l1,int r1,int l2,int r2)
{
set<node>::iterator itr=split(r1+1),itl=split(l1);
//vector<node> a;
int len=0;
for(;itl!=itr;itl++)
{
a[++len].l=itl->l;
a[len].r=itl->r;
a[len].v=itl->v;
}
set<node>::iterator r=split(r2+1),l=split(l2);
s.erase(l,r);
for(int i=1;i<=len;i++)
{
s.insert(node(l2+a[i].l-l1,l2+a[i].r-l1,a[i].v));
}
}
void exchange(int l1,int r1,int l2,int r2)
{
set<node>::iterator itr=split(r1+1),itl=split(l1),l=itl,r=itr;
//vector<node> a,b;
int len1=0,len2=0;
for(;itl!=itr;itl++)
{
a[++len1].l=itl->l;
a[len1].r=itl->r;
a[len1].v=itl->v;
}
s.erase(l,r);
itr=split(r2+1),itl=split(l2);
l=itl;
r=itr;
for(;itl!=itr;itl++)
{
b[++len2].l=itl->l;
b[len2].r=itl->r;
b[len2].v=itl->v;
}
s.erase(l,r);
for(int i=1;i<=len2;i++)
{
s.insert(node(l1+b[i].l-l2,l1+b[i].r-l2,b[i].v));
}
for(int i=1;i<=len1;i++)
{
s.insert(node(l2+a[i].l-l1,l2+a[i].r-l1,a[i].v));
}
/*set<node>::iterator itr=split(r1+1),itl=split(l1),it1r=split(r2+1),it1l=split(l2);
vector<node> b;
for(set<node>::iterator it=it1l;it!=it1r;it++)
{
b.push_back(node(it->l,it->r,it->v));
}
int pos=l2;
s.erase(it1l,it1r);
for(set<node>::iterator it=itl;it!=itr;it++)
{
s.insert(node(pos,pos+it->r-it->l,it->v));
pos+=it->r-it->l+1;
}
pos=l1;
for(int i=0;i<b.size();i++)
{
s.insert(node(l+r-b[i].r,pos+l+r-b[i].l,b[i].v));
pos+=it[r]-it[l]+1;
}*/
}
void turn(int l,int r)
{
set<node>::iterator itr=split(r+1),itl=split(l),l1=itl,r1=itr;
//vector<node> b;
int len=0;
for(;itl!=itr;itl++)
{
a[++len].l=itl->l;
a[len].r=itl->r;
a[len].v=itl->v;
}
s.erase(l1,r1);
for(int i=1;i<=len;i++)
{
s.insert(node(l+r-a[i].r,l+r-a[i].l,a[i].v));
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
{
int x;
x=read();
s.insert(node(i,i,x));
}
s.insert(node(n+1,n+1,0));
for(int i=1;i<=m;i++)
{
int opt;
cin>>opt;
if(opt==1)
{
int x,y;
x=read();y=read();
cout<<query(x,y)<<endl;
}
if(opt==2)
{
int x,y;
long long z;
x=read();y=read();
cin>>z;
assign(x,y,z);
}
if(opt==3)
{
int x,y;
long long z;
x=read();y=read();
cin>>z;
change(x,y,z);
}
if(opt==4)
{
int x1,y1,x2,y2;
x1=read();y1=read();x2=read();y2=read();
rcopy(x1,y1,x2,y2);
}
if(opt==5)
{
int x1,y1,x2,y2;
x1=read();y1=read();x2=read();y2=read();
exchange(x1,y1,x2,y2);
}
if(opt==6)
{
int x,y;
x=read();y=read();
turn(x,y);
}
}
for(set<node>::iterator it=s.begin();it!=s.end()&&it->r<=n;it++)
{
for(int i=it->l;i<=it->r;i++)
{
printf("%lld ",it->v);
}
}
return 0;
}
改了14遍了,裂开哩