#include<bits/stdc++.h>
#define int long long
#define fep(i,l,r) for(int i=l;i<=r;i++)
#define defep(i,r,l) for(int i=r;i>=l;i--)
#define fst first
#define scd second
#define all(x) begin(x),end(x)
#define lowbit(x) ((x)&(-x))
#define pb(a) push_back(a)
#define sqt(x) (int)(floor(sqrt((long double) x + 1e-16)) )
#define sqr(x) ((x)*(x))
#define Chtholly(x) ios::sync_with_stdio(x)
//吾日三省吾身:你清多测了吗?你数组开够了吗?你访问越界了吗?
using namespace std;
const int N=3e5+123;
const int mod=1e9+7;
struct Chtholly{
mutable int l,r,v;
bool operator < (Chtholly p)const{
return l<p.l;
};
};
set<Chtholly>s;
int n,m;
auto split(int x){
auto it=s.lower_bound({x,0,0});
if(it!=s.end()&&it->l==x) return it;
int l=(--it)->l,r=it->r,v=it->v;
return s.erase(it),s.insert({l,x-1,v}),s.insert({x,r,v}).fst;
}
void assign(int l,int r,int t){
auto itr=split(r+1),itl=split(l);
s.erase(itl,itr),s.insert({l,r,t});
return ;
}
signed main(){
Chtholly(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
int x;cin>>x;s.insert({i,i,x});
}
for(int i=1;i<=m;i++){
int op,l,r;
cin>>op>>l>>r;
if(op==1){
int sum=0;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
(sum+=it->v*(it->r-it->l+1))%=mod;
cout<<sum<<endl;
}
if(op==2){
int x;cin>>x;
assign(l,r,x);
}
if(op==3){
int x;cin>>x;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
(it->v+=x)%=mod;
}
if(op==4){
int lx,rx;
cin>>lx>>rx;
auto ir2=split(rx+1),il2=split(lx);
auto ir1=split(r+1),il1=split(l);
vector<Chtholly>v;
for(auto it=il1;it!=ir1;it++)
v.push_back({it->l+(lx-l),it->r+(rx-r),it->v});
s.erase(il2,ir2);
for(auto now:v)
s.insert(now);
}
if(op==5){
int lx,rx;
cin>>lx>>rx;
auto ir2=split(rx+1),il2=split(lx);
auto ir1=split(r+1),il1=split(l);
vector<Chtholly>v1,v2;
for(auto it=il1;it!=ir1;it++)
v1.push_back({it->l+(lx-l),it->r+(rx-r),it->v});
for(auto it=il2;it!=ir2;it++)
v2.push_back({it->l+(l-lx),it->r+(r-rx),it->v});
s.erase(il1,ir1),s.erase(il2,ir2);
for(auto now:v1)
s.insert(now);
for(auto now:v2)
s.insert(now);
}
if(op==6){
vector<Chtholly>v;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
v.push_back({it->l,it->r,it->v});
s.erase(itl,itr);
int bas=0;
reverse(all(v));
for(auto now:v){
s.insert({l+bas,l+(now.r-now.l)+bas,now.v});
bas+=(now.r-now.l+1);
}
}
// for(auto now:s){
// cout<<now.l<<" "<<now.r<<" "<<now.v<<endl;
// // for(int i=now.l;i<=now.r;i++)
// // cout<<now.v<<" ";
// }
// cout<<endl;
}
for(auto now:s){
for(int i=now.l;i<=now.r;i++)
cout<<now.v<<" ";
}
return 0;
}
*/
submission