#include<bits/stdc++.h>
using namespace std;
int n,m,root=0,a[300005],b[300005],c[300005],d[300005][3],e[300005],l[300005],r[300005],k,x,y,xx,yy,z;
void pushdown(int x)
{
if (d[x][0]!=-1)
{
a[x]=d[x][0];
b[x]=d[x][0]*c[x];
d[l[x]][0]=d[x][0];
d[r[x]][0]=d[x][0];
d[x][0]=-1;
}
if (d[x][1])
{
a[x]=(a[x]+d[x][1])%1000000007;
b[x]=(b[x]+(long long)d[x][1]*c[x]%1000000007)%1000000007;
d[l[x]][1]=(d[x][1]+d[l[x]][1])%1000000007;
d[r[x]][1]=(d[x][1]+d[r[x]][1])%1000000007;
d[x][1]=0;
}
if (d[x][2])
{
swap(l[x],r[x]);
d[l[x]][2]^=1;
d[r[x]][2]^=1;
d[x][2]=0;
}
}
int merge(int x,int y)
{
if (x && y)
{
if (e[x]<e[y])
{
pushdown(x);
r[x]=merge(r[x],y);
b[x]=(a[x]+b[l[x]]+b[r[x]])%1000000007;
c[x]=c[l[x]]+c[r[x]]+1;
return x;
}
else
{
pushdown(y);
l[y]=merge(x,l[y]);
b[y]=(a[y]+b[l[y]]+b[r[y]])%1000000007;
c[y]=c[l[y]]+c[r[y]]+1;
return y;
}
}
else
return x+y;
}
void split(int x,int &y,int &z,int k)
{
if (x)
{
pushdown(x);
if (c[l[x]]<k)
{
y=x;
split(r[x],r[x],z,k-c[l[x]]-1);
}
else
{
z=x;
split(l[x],y,l[x],k);
}
b[x]=(a[x]+b[l[x]]+b[r[x]])%1000000007;
c[x]=c[l[x]]+c[r[x]]+1;
}
else
{
y=0;
z=0;
}
}
int sum(int num1,int num2)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
int result=b[y];
root=merge(merge(x,y),z);
return result;
}
void cover(int num1,int num2,int num3)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
d[y][0]=num3;
d[y][1]=0;
root=merge(merge(x,y),z);
}
void add(int num1,int num2,int num3)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
d[y][1]=(d[y][1]+num3)%1000000007;
root=merge(merge(x,y),z);
}
void fuzhi(int num1,int num2,int num3,int num4)
{
int x,xx,y,zz,z;
bool k;
if (num1>num3)
{
swap(num1,num3);
swap(num2,num4);
k=1;
}
else
k=0;
split(root,zz,z,num4);
split(zz,y,zz,num3-1);
split(y,xx,y,num2);
split(xx,x,xx,num1-1);
if (k)
{
b[xx]=(b[xx]+a[zz]-a[xx]+1000000007)%1000000007;
a[xx]=a[zz];
}
else
{
b[zz]=(b[zz]+a[xx]-a[zz]+1000000007)%1000000007;
a[zz]=a[xx];
}
root=merge(merge(merge(x,xx),y),merge(zz,z));
}
void jiaohuan(int num1,int num2,int num3,int num4)
{
int x,xx,y,zz,z;
if (num1>num3)
{
swap(num1,num3);
swap(num2,num4);
}
split(root,zz,z,num4);
split(zz,y,zz,num3-1);
split(y,xx,y,num2);
split(xx,x,xx,num1-1);
root=merge(merge(merge(x,zz),y),merge(xx,z));
}
void rotate(int num1,int num2)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
if (y)
d[y][2]^=1;
root=merge(merge(x,y),z);
}
void print(int x)
{
pushdown(x);
if (l[x])
print(l[x]);
cout<<a[x]<<' ';
if (r[x])
print(r[x]);
}
int main()
{
srand(time(nullptr));
cin>>n>>m;
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
a[i]=x;
b[i]=x;
c[i]=1;
d[i][0]=-1;
e[i]=rand();
root=merge(root,i);
}
while (m--)
{
scanf("%d",&k);
if (k==1)
{
scanf("%d%d",&x,&y);
cout<<sum(x,y)<<'\n';
}
else if (k==2)
{
scanf("%d%d%d",&x,&y,&z);
cover(x,y,z);
}
else if (k==3)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
else if (k==4)
{
scanf("%d%d%d%d",&x,&y,&xx,&yy);
fuzhi(x,y,xx,yy);
}
else if (k==5)
{
scanf("%d%d%d%d",&x,&y,&xx,&yy);
jiaohuan(x,y,xx,yy);
}
else
{
scanf("%d%d",&x,&y);
rotate(x,y);
}
}
print(root);
}