#include<bits/stdc++.h>
#define INF 1e16
#define endl '\n'
#define PI acos(-1)
#define pb push_back
#define int long long
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int N = 4e6+5;
const int MOD = 1e9+7;
inline int read(){
register int x=0,f=1;register char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,rt,tot,cnt,a[N];
struct FHQ{int ls,rs,val,sum,siz,rev,add,cov,rnd;}t[N];
int New(int x){t[++tot]={0,0,x,x,1,0,0,-1,rand()};return tot;}
int Copy(int x){int rt=New(0);t[rt]=t[x];return rt;}
void Pushup(int u){
t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
t[u].sum=(t[t[u].ls].sum+t[t[u].rs].sum+t[u].val)%MOD;
}
void PushdownReverse(int u){
swap(t[u].ls,t[u].rs);
t[u].rev^=1;
}
void PushdownAdd(int u,int k){
t[u].val=(t[u].val+k)%MOD;
t[u].add=(t[u].add+k)%MOD;
t[u].sum=(t[u].sum+k*t[u].siz)%MOD;
}
void PushdownCover(int u,int k){
t[u].add=0,t[u].cov=k;
t[u].val=k;
t[u].sum=(t[u].siz*k)%MOD;
}
void Pushdown(int u){
if(t[u].cov!=-1||t[u].add||t[u].rev){
if(t[u].ls)t[u].ls=Copy(t[u].ls);
if(t[u].rs)t[u].rs=Copy(t[u].rs);
}
if(t[u].cov!=-1){
if(t[u].ls)PushdownCover(t[u].ls,t[u].cov);
if(t[u].rs)PushdownCover(t[u].rs,t[u].cov);
t[u].cov=-1;
}
if(t[u].add){
if(t[u].ls)PushdownAdd(t[u].ls,t[u].add);
if(t[u].rs)PushdownAdd(t[u].rs,t[u].add);
t[u].add=0;
}
if(t[u].rev){
if(t[u].ls)PushdownReverse(t[u].ls);
if(t[u].rs)PushdownReverse(t[u].rs);
t[u].rev=0;
}
}
void split(int u,int k,int &x,int &y){
if(!u){x=y=0;return;}
Pushdown(u);
if(t[t[u].ls].siz+1<=k){
x=Copy(u);
split(t[x].rs,k-t[t[x].ls].siz-1,t[x].rs,y);
Pushup(x);
}
else{
y=Copy(u);
split(t[y].ls,k,x,t[y].ls);
Pushup(y);
}
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(t[x].rnd<=t[y].rnd){
Pushdown(x),x=Copy(x);
t[x].rs=merge(t[x].rs,y);
Pushup(x);return x;
}
else{
Pushdown(y),y=Copy(y);
t[y].ls=merge(x,t[y].ls);
Pushup(y);return y;
}
}
int query(int l,int r){
int x,y,z,ans;
split(rt,r,y,z),split(y,l-1,x,y);
ans=t[y].sum;
rt=merge(merge(x,y),z);
return ans;
}
void cover(int l,int r,int k){
int x,y,z;
split(rt,r,y,z),split(y,l-1,x,y);
y=Copy(y),PushdownCover(y,k);
rt=merge(merge(x,y),z);
}
void add(int l,int r,int k){
int x,y,z;
split(rt,r,y,z),split(y,l-1,x,y);
y=Copy(y),PushdownAdd(y,k);
rt=merge(merge(x,y),z);
}
void copy(int l1,int r1,int l2,int r2){
int v,w,x,y,z,fl=0;
if(l1>l2)swap(l1,l2),swap(r1,r2),fl=1;
split(rt,r2,y,z);
split(y,l2-1,x,y);
split(x,r1,w,x);
split(w,l1-1,v,w);
if(fl)w=Copy(y);
else y=Copy(w);
rt=merge(merge(merge(v,w),x),merge(y,z));
}
void swap(int l1,int r1,int l2,int r2){
int v,w,x,y,z;
if(l1>l2)swap(l1,l2),swap(r1,r2);
split(rt,r2,y,z);
split(y,l2-1,x,y);
split(x,r1,w,x);
split(w,l1-1,v,w);
rt=merge(merge(merge(v,y),x),merge(w,z));
}
void reverse(int l,int r){
int x,y,z;
split(rt,r,y,z),split(y,l-1,x,y);
y=Copy(y),PushdownReverse(y);
rt=merge(merge(x,y),z);
}
void dfs(int u){
Pushdown(u);
if(t[u].ls)dfs(t[u].ls);
a[++cnt]=t[u].val;
if(t[u].rs)dfs(t[u].rs);
}
int build(int l,int r){
if(l>r)return 0;
int mid=l+r>>1,u=New(a[mid]);
t[u].ls=build(l,mid-1);
t[u].rs=build(mid+1,r);
Pushup(u);return u;
}
void Print(){
cnt=0,dfs(rt);
for(int i=1;i<=n;i++)cout<<a[i]<<" ";
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
rt=build(1,n);
for(int i=1,op,l1,r1,l2,r2,k;i<=m;i++){
cin>>op;
if(op==1)cin>>l1>>r1,cout<<query(l1,r1)<<endl;
if(op==2)cin>>l1>>r1>>k,cover(l1,r1,k);
if(op==3)cin>>l1>>r1>>k,add(l1,r1,k);
if(op==4)cin>>l1>>r1>>l2>>r2,copy(l1,r1,l2,r2);
if(op==5)cin>>l1>>r1>>l2>>r2,swap(l1,r1,l2,r2);
if(op==6)cin>>l1>>r1,reverse(l1,r1);
if(tot>1000000)cnt=0,dfs(rt),rt=tot=0,rt=build(1,n);
}
Print();
return 0;
}