rt
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+10;
const int mod=1e9+7;
int n,m;
struct chtholly{
int l,r;
mutable ll v;
bool operator<(const chtholly &A)const{return l<A.l;}
}a[N],b[N];
set<chtholly> s;
set<chtholly>::iterator split(int x){
set<chtholly>::iterator it=s.lower_bound((chtholly){x,0,0});
if(it!=s.end()&&it->l==x) return it;
it--;
if(it->r<x) return s.end();
int l=it->l,r=it->r;ll v=it->v;
s.erase(it);
s.insert((chtholly){l,x-1,v});
return s.insert((chtholly){x,r,v}).first;
}
void assign(int l,int r,ll x){
set<chtholly>::iterator itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert((chtholly){l,r,x});
}
void add(int l,int r,ll x){
set<chtholly>::iterator itr=split(r+1),itl=split(l);
for(set<chtholly>::iterator it=itl;it!=itr;++it) it->v=(it->v+x)%mod;
}
void copy(int l_1,int r_1,int l_2,int r_2){
int len=0;
set<chtholly>::iterator itr=split(r_1+1),itl=split(l_1);
for(set<chtholly>::iterator it=itl;it!=itr;++it) a[++len]=(chtholly){it->l+l_2-l_1,it->r+l_2-l_1,it->v};
itr=split(r_2+1),itl=split(l_2);
s.erase(itl,itr);
for(;len;--len) s.insert(a[len]);
}
void cswap(int l_1,int r_1,int l_2,int r_2){
int lena=0,lenb=0;
set<chtholly>::iterator itr=split(r_1+1),itl=split(l_1);
for(set<chtholly>::iterator it=itl;it!=itr;++it) a[++lena]=(chtholly){it->l+l_2-l_1,it->r+l_2-l_1,it->v};
s.erase(itl,itr);
itr=split(r_2+1),itl=split(l_2);
for(set<chtholly>::iterator it=itl;it!=itr;++it) b[++lenb]=(chtholly){it->l-l_2+l_1,it->r-l_2+l_1,it->v};
s.erase(itl,itr);
for(;lena;--lena) s.insert(a[lena]);
for(;lenb;--lenb) s.insert(b[lenb]);
}
void creverse(int l,int r){
set<chtholly>::iterator itr=split(r+1),itl=split(l);
int len=0;
for(set<chtholly>::iterator it=itl;it!=itr;++it) a[++len]=(chtholly){r+l-it->l,r+l-it->r,it->v};
s.erase(itl,itr);
for(;len;--len) s.insert(a[len]);
}
ll query(int l,int r){
set<chtholly>::iterator itr=split(r+1),itl=split(l);
ll res=0;
for(set<chtholly>::iterator it=itl;it!=itr;++it) res=(res+it->v*(it->r-it->l+1)%mod)%mod;
return res;
}
int main()
{
// freopen("","r",stdin);
// freopen("","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1,a;i<=n;++i) scanf("%d",&a),s.insert((chtholly){i,i,a});
int op,l_1,r_1,l_2,r_2;
ll v;
while(m--){
scanf("%d%d%d",&op,&l_1,&r_1);
if(op==1) printf("%lld\n",query(l_1,r_1));
else if(op==2) scanf("%lld",&v),assign(l_1,r_1,v);
else if(op==3) scanf("%lld",&v),add(l_1,r_1,v);
else if(op==4) scanf("%d%d",&l_2,&r_2),copy(l_1,r_1,l_2,r_2);
else if(op==5) scanf("%d%d",&l_2,&r_2),cswap(l_1,r_1,l_2,r_2);
else creverse(l_1,r_1);
}
for(set<chtholly>::iterator it=s.begin();it!=s.end();++it)
for(int i=it->l;i<=it->r;++i) printf("%lld ",it->v);
return 0;
}