#include<bits/stdc++.h>
#define itt set<odt>::iterator
#define int long long
using namespace std;
const int mod=1e9+7;
struct odt{
int l,r;
mutable int v;
bool operator < (const odt &a)const{
return l<a.l;
}
odt(int L=0,int R=0,int _v=0):l(L),r(R),v(_v){return;}
}a[300005];
set<odt>t;int n,q;
inline itt sp(int x){
itt it=t.lower_bound(odt(x));
if(it!=t.end()&&it->l==x)return it;
it--;int l=it->l,r=it->r,v=it->v;
t.erase(it);t.insert(odt(l,x-1,v));
return t.insert(odt(x,r,v)).first;
}
inline void ass(int x,int y,int z){
itt itr=sp(y+1), itl=sp(x);
t.erase(itl,itr);
t.insert(odt(x,y,z));
}
inline void add(int x,int y,int z){
itt itr=sp(y+1),itl=sp(x);
for(itt it=itl;it!=itr;it++)it->v+=z,it->v%=mod;
}
inline int sum(int x,int y){
itt itr=sp(y+1),itl=sp(x);
int res=0;
for(itt i=itl;i!=itr;i++){
res+=1ll*(i->v)*(i->r-i->l+1);
res%=mod;
}
return res;
}
inline void copy(int l,int r,int L,int R){
itt itr1=sp(r+1),itl1=sp(l);
itt itr=sp(R+1),itl=sp(L);
t.erase(itl,itr);
for(itt i=itl1;i!=itr1;i++){
t.insert(odt(L+i->l-l,L-l+i->r,i->v));
}
}
inline void swa(int l,int r,int L,int R){
itt itr1=sp(r+1),itl1=sp(l);
itt itr=sp(R+1),itl=sp(L);
int len=0;
for(itt i=itl;i!=itr;i++){
a[++len].l=i->l;
a[len].r=i->r;
a[len].v=i->v;
}
t.erase(itl,itr);
for(itt i=itl1;i!=itr1;i++){
t.insert(odt(L+i->l-l,L-l+i->r,i->v));
}
t.erase(itl1,itr1);
for(int i=1;i<=len;i++){
t.insert(odt(a[i].l-L+l,a[i].r-L+l,a[i].v));
}
}
inline void re(int l,int r){
itt itr=sp(r+1),itl=sp(l);
int len=0;
for(itt i=itl;i!=itr;i++){
a[++len].l=i->l;
a[len].r=i->r;
a[len].v=i->v;
}
t.erase(itl,itr);
for(int i=1;i<=len;i++){
t.insert(odt(r-a[i].r+l,r-a[i].l+l,a[i].v));
}
}
void tt(int n){
itt itl=sp(1),itr=sp(n+1);
for(itt i=itl;i!=itr;i++){
for(int j=1;j<=i->r-i->l+1;j++)cout<<i->v%mod<<" ";
}cout<<"\n";
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1,x;i<=n;i++){
cin>>x;
t.insert(odt(i,i,x));
}
t.insert(odt(n+1,n+1,0));
for(int i=1,op,x,y,z,h;i<=q;i++){
cin>>op>>x>>y;
if(x>y)swap(x,y);
if(op==1){cout<<sum(x,y)<<"\n";}
if(op==2){cin>>z;ass(x,y,z);}
if(op==3){cin>>z;add(x,y,z);}
if(op==4){cin>>z>>h;if(z>h)swap(z,h);if(z>x){swap(z,x);swap(y,h);}copy(x,y,z,h);}
if(op==5){cin>>z>>h;if(z>h)swap(z,h);if(z>x){swap(z,x);swap(y,h);}swa(x,y,z,h);}
if(op==6){re(x,y);}
}
tt(n);
return 0;
}