/* Name:CF438D
Copyright:[Xcoi]
Author:xbb2
Date:2022.8.27
Description:*/
#include<bits/stdc++.h>
using namespace std;
const long long N=1e6+10;
//const long long mod;
const long long inf=309133584;
long long a[N];
struct tree{
long long d[N>>2],maxx[N>>2];
inline void build(long long s,long long t,long long p) {
if(s==t){d[p]=maxx[p]=a[s];return ;}
long long m=((s+t)>>1);
build(s,m,p*2),build(m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
inline void update(long long x,long long c,long long s,long long t,long long p){
if(s==t&&s==x){d[p]=maxx[p]=c;return ;}
long long m=((s+t)>>1);
if(x<=m)update(x,c,s,m,p*2);
if(m<x) update(x,c,m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
inline void update_mod(long long l,long long r,long long mod,long long s,long long t,long long p){
if(l<=s&&t<=r){
if(maxx[p]<mod)return ;
d[p]%=mod;
maxx[p]%=mod;
if(s==t)return ;
}
long long m=((s+t)>>1);
if(l<=m)update_mod(l,r,mod,s,m,p*2);
if(m<r) update_mod(l,r,mod,m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
inline long long query(long long l,long long r,long long s,long long t,long long p){
if(l<=s&&t<=r)return d[p];
long long m=((s+t)>>1),ans=0;
if(l<=m)ans+=query(l,r,s,m,p*2);
if(m<r) ans+=query(l,r,m+1,t,p*2+1);
return ans;
}
}T;
long long n,m;
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>m;
for(long long i=1;i<=n;i++) scanf("%lld",&a[i]);
T.build(1,n,1);
for(long long i=1;i<=m;i++) {
long long opt,l,r,x;scanf("%lld%lld%lld",&opt,&l,&r);
if(opt==1)
printf("%lld\n",T.query(l,r,1,n,1));
if(opt==2)
scanf("%lld",&x),T.update_mod(l,r,x,1,n,1);
if(opt==3)
T.update(l,r,1,n,1);
}
return 0;
}
RT