#include<bits/stdc++.h>
using namespace std;
long long mod =1e9+7;
struct node{
int l,r;
mutable long long val;
node(int L,int R=-1,int v=0):l(L),r(R),val(v){}
bool operator<(const node o)const{return l<o.l;}
};
set<node>s;
#define IT set<node>::iterator
IT split(int pos){
IT it=s.lower_bound(node(pos));
if (it != s.end() && it->l == pos) return it;
--it;
node lef=node(it->l,pos-1,it->val);
node rig=node(pos,it->r,it->val);
s.erase(it);
s.insert(lef);
return s.insert(rig).first;
}
void assign(int l,int r,long long v){
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,v));
}
int sum(int l ,int r){
IT itr=split(r+1),itl=split(l);
long long res=0;
for(IT i=itl;i!=itr;++i){
res+=(i->r-i->l+1)*i->val;
res%=mod;
}
return res;
}
void adde(int l,int r,long long v){
IT itr=split(r+1),itl=split(l);
for(IT i=itl;i!=itr;++i){
i->val+=v;
i->val%=mod;
}
}
void cp(int l,int r,int l2,int r2){
// cout<<"Copy"<<l<<" "<<r<<" "<<l2<<" "<<r2<<endl;
vector<node>li;
IT itr=split(r+1),itl=split(l);
for(IT i=itl;i!=itr;++i){
li.push_back(node(i->l-l+l2,i->r-r+l2,i->val));
// printf("Insert a node as %d,%d,%d.\n",i->l-l+l2,i->r-r+l2,i->val);
}
itr=split(r2+1),itl=split(l2);
s.erase(itl,itr);
for(int i=0;i<li.size();i++){
s.insert(li[i]);}
}
void swape(int l,int r,int l2,int r2){
if(l>l2){
swap(l,l2);swap(r,r2);
}
vector<node>li,lis;
IT itr=split(r+1),itl=split(l);
for(IT i=itl;i!=itr;++i){
li.push_back(node(i->l-l+l2,i->r-l+l2,i->val));
}
s.erase(itl,itr);
IT itr2=split(r2+1),itl2=split(l2);
for(IT i=itl2;i!=itr2;++i){
lis.push_back(node(i->l-l2+l,i->r-l2+l,i->val));
}
s.erase(itl2,itr2);
for(int i=0;i<lis.size();i++){
s.insert(lis[i]);
// printf("Insert a node as %d,%d,%d.\n",lis[i].l,lis[i].r,lis[i].val);
}
for(int i=0;i<li.size();i++){
// printf("Insert a node as %d,%d,%d.\n",li[i].l,li[i].r,li[i].val);
s.insert(li[i]);
}
}
void flip(int l,int r){
vector<node>li;
IT itr=split(r+1),itl=split(l);
for(IT i=itl;i!=itr;++i){
li.push_back(node(r-i->r+l,li[i].l,i->val));
}
s.erase(itl,itr);
for(int i=li.size()-1;i>=0;i--){
// printf("Fliped node as %d %d %d.\n",li[i].l,li[i].r,li[i].val);
s.insert(li[i]);
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int x;cin>>x;
s.insert(node(i,i,x));
}
s.insert(node(n+1,n+1,1145141919));
for(int i=1;i<=m;i++){
for(IT i=s.begin();i!=s.end();++i){
for(int j=i->l;j<=i->r;j++)cout<<i->val<<" ";
cout<<" ";
}
cout<<endl;
int op,l,r;
cin>>op>>l>>r;
if(op==1){
cout<<sum(l,r)<<"\n";
}
else if(op==2){
int v;
cin>>v;
assign(l,r,v);
}
else if(op==3){
int val;cin>>val;
adde(l,r,val);
}
else if(op==4){
int l2,r2;cin>>l2>>r2;
cp(l,r,l2,r2);
}
else if(op==5){
int l2,r2;
cin>>l2>>r2;
swape(l,r,l2,r2);
}
else if(op==6)flip(l,r);
}
for(IT i=s.begin();;++i){
if(i->val==1145141919)return 0;
for(int j=i->l;j<=i->r;++j)cout<<i->val<<" ";
}
}