#include<bits/stdc++.h>
#define ll long long
#define i128 __int128
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fs first
#define sc second
#define x0 _x0_
#define y1 _y1_
#define endl '\n'
#define re register
#define pb push_back
#define vi vector<int>
#define pq priority_queue
#define mem(a,x) memset((a),(x),sizeof(a))
#define debug puts("AK IOI")
#define sz(s) (int)(s.size())
#define all(a) a.begin(),a.end()
#define rd(l,r) (myrand()%(r-l+1)+l)
#define print(x) {cout<<x<<endl;return;}
#define For(x,y,z) for(int x = y;x <= z;x++)
#define For_(x,y,z) for(int x = y;x >= z;x--)
#define between(x, flo, top) (flo <= x && x <= top)
using namespace std;
#define int long long
const int mod = 1e9+7;
mt19937 myrand(time(0));
const int inf = 0x3f3f3f3f,N = 3e5+5,M = 1e6+5,K = 3000+5;
const long long linf = 0x3f3f3f3f3f3f3f3f;
namespace FastIO {template <typename T = int>inline T read() {T s=0,w=1;char c=getchar();while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}while(isdigit(c))s=(s<<1)+(s<<3)+(c^48),c=getchar();return s*w;}template <typename T>inline void read(T &s){s=0;int w=1;char c=getchar();while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}while(isdigit(c))s=(s<<1)+(s<<3)+(c^48),c=getchar();s*=w;}template <typename T, typename... Args> inline void read(T &x, Args &...args) {read(x), read(args...);}template <typename T>inline void write(T x,char ch = '\n') {if(x<0)x=-x,putchar('-');static char stk[200];int top=0;do{stk[top++]=x%10+'0',x/=10;}while(x);while(top)putchar(stk[--top]);putchar(ch);return;}}
using namespace FastIO;
int n,m;
int a[N];
namespace ODT{
struct node{
int l,r;mutable int val;
node(int L,int R=-1,int Val=0){l=L,r=R,val=Val;}
bool operator<(const node&a)const{return l<a.l;}
};set<node> odt;
auto split(int pos){
auto it=odt.lower_bound(node(pos));
if(it!=odt.end()&&it->l==pos)return it;
it--;int L=it->l,R=it->r,Val=it->val;
odt.erase(it),odt.insert(node{L,pos-1,Val});
return odt.insert(node{pos,R,Val}).fs;
}void assign(int l,int r,int val){
auto R=split(r+1),L=split(l);
odt.erase(L,R);odt.insert(node{l,r,val});
}void add(int l,int r,int val){
auto R=split(r+1),L=split(l);
for(auto it=L;it!=R;it++)it->val += val;
}int kth(int l,int r,int k){
vector<pii> a;
auto R=split(r+1),L=split(l);
for(auto it=L;it!=R;it++)a.pb({it->val,(it->r)-(it->l)+1});
sort(a.begin(),a.end());
for(auto it=a.begin();it!=a.end();it++){
k-=it->second;
if(k <= 0)return it->first;
}return -1;
}
int sum(int l,int r){
int ans=0;
auto R=split(r+1),L=split(l);
for(auto it=L;it!=R;it++)ans+=it->val*((it->r)-(it->l)+1);
return ans;
}void copy(int l1,int r1,int l2,int r2){
auto R=split(r1+1),L=split(l1);
vector<node> v;
for(auto it=L;it!=R;it++)v.pb({it->l,it->r,it->val});
auto r_=split(r2+1),l_=split(l2);
odt.erase(l_,r_);
for(auto it:v)odt.insert(node(it.l-l1+l2,it.r-r1+r2,it.val));
}void Swap(int l1,int r1,int l2,int r2){
if(l1>l2){swap(l1,l2),swap(r1,r2);}
vector<node> v1,v2;
auto R1=split(r1+1),L1=split(l1);
for(auto it=L1;it!=R1;it++) v1.pb({it->l,it->r,it->val});
auto R2=split(r2+1),L2=split(l2);
for(auto it=L2;it!=R2;it++) v2.pb({it->l,it->r,it->val});
R1=split(r1+1),L1=split(l1);odt.erase(L1,R1);
R2=split(r2+1),L2=split(l2);odt.erase(L2,R2);
for(auto it:v2) odt.insert(node{it.l-l2+l1,it.r-l2+l1,it.val});
for(auto it:v1) odt.insert(node{it.l-l1+l2,it.r-l1+l2,it.val});
}void reverse(int l,int r){
if(l>r)swap(l,r);
auto R=split(r+1),L=split(l);
vector<node> a;
for(auto it=L;it!=R;it++) a.pb(node(it->l,it->r,it->val));
odt.erase(L,R);
for(auto it:a) odt.insert(node(r-it.r+l,r-it.l+l,it.val));
}void Print(){
for(auto it=odt.begin();it!=odt.end()&&it->r<=n;it++) for(int i=it->l;i<=it->r;i++) cout<<it->val<<" ";
}
}using namespace ODT;
void solve(){
cin >> n >> m;
For(i,1,n){
cin>>a[i];
odt.insert(node(i,i,a[i]));
}
while(m--){
int op,l,r,val,l1,r1,l2,r2;
read(op);
if(op==1){
read(l,r);
cout << sum(l,r) << endl;
} else if(op==2){
read(l,r,val);
assign(l,r,val);
} else if(op==3){
read(l,r,val);
add(l,r,val);
} else if(op==4){
read(l1,r1,l2,r2);
copy(l1,r1,l2,r2);
} else if(op==5){
read(l1,r1,l2,r2);
Swap(l1,r1,l2,r2);
} else{
read(l,r);
reverse(l,r);
}
}
Print();
}signed main(){
int T=1;
For(_,1,T) solve();
return 0;
}