#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int ls,rs,pri,sum,tag,size,val,key;
}t[100005];
int root,cnt;
void upt(int u){
t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
t[u].sum=t[t[u].ls].sum+t[t[u].rs].sum+t[u].val;
}
int newnode(int x,int k){
cnt++;
t[cnt].pri=rand();
t[cnt].sum=t[cnt].val=x;
t[cnt].ls=t[cnt].rs=0;
t[cnt].size=1;
t[cnt].key=k;
return cnt;
}
void pushdown(int u){
if(t[u].tag){
t[u].val%=t[u].tag;
t[t[u].ls].tag=t[t[u].rs].tag=t[u].tag;
}
t[u].tag=0;
upt(u);
}
void split(int u,int x,int &l,int &r){
if(u==0){
l=r=0;
return ;
}
pushdown(u);
if(t[u].key<=x){
l=u;
split(t[u].rs,x,t[u].rs,r);
}
else{
r=u;
split(t[u].ls,x,l,t[u].ls);
}
upt(u);
return ;
}
int merge(int l,int r){
if(l==0||r==0)
return l+r;
if(t[l].pri>t[r].pri){
pushdown(l);
t[l].rs=merge(t[l].rs,r);
upt(l);
return l;
}
else{
pushdown(r);
t[r].ls=merge(l,t[r].ls);
upt(r);
return r;
}
}
void insert(int x,int k){
int l,r;
split(root,k,l,r);
root=merge(merge(l,newnode(x,k)),r);
}
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int x;
cin>>x;
insert(x,i);
}
for(int i=1;i<=n;i++){
int opt,x,y,z;
cin>>opt>>x>>y;
if(opt==1){
int l,r,p;
split(root,x-1,l,r);
split(r,y,r,p);
plusupt(r);
printf("%d\n",t[r].sum);
root=merge(l,merge(r,p));
}
if(opt==2){
cin>>z;
int l,r,p;
split(root,x-1,l,r);
split(r,y,r,p);
t[r].tag=z;
root=merge(l,merge(r,p));
}
if(opt==3){
int l,r,p;
split(root,x-1,l,r);
split(r,x,r,p);
t[r].val=y;
root=merge(l,merge(r,p));
}
}
return 0;
}