rt
#include <bits/stdc++.h>
#define int __int128
using namespace std;
const int maxn=2e5+5,mod=4294967296;
int n,q,a[maxn];
struct tree{
int l,r,sum,lcm;
}tr[maxn<<2];
int read(){
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') w=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=(s<<3)+(s<<1)+(c^48);
c=getchar();
}
return s*w;
}
void write(int x){
if(x<0){
putchar('-');
x=~x+1;
}
if(x>=10) write(x/10);
putchar(x%10+'0');
return;
}
__int128 lcm(int x,int y){
__int128 z=x*y/__gcd(x,y);
return z%mod;
}
void pushup(int p){
tr[p].lcm=lcm(tr[p<<1].lcm,tr[p<<1|1].lcm);
tr[p].sum=(tr[p<<1].sum+tr[p<<1|1].sum)%mod;
}
void build(int p,int l,int r){
tr[p].l=l;
tr[p].r=r;
if(l==r){
tr[p].sum=tr[p].lcm=a[l];
return;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void quxiu(int p,int l,int r,int x){
if(x%tr[p].lcm==0) return;
if(tr[p].l==tr[p].r){
tr[p].lcm=__gcd(tr[p].lcm,x);
tr[p].sum=tr[p].lcm%mod;
return;
}
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) quxiu(p<<1,l,r,x);
if(r>mid) quxiu(p<<1|1,l,r,x);
pushup(p);
}
int qucha(int p,int l,int r){
if(l<=tr[p].l&&r>=tr[p].r) return tr[p].sum;
int mid=tr[p].l+tr[p].r>>1,ans=0;
if(l<=mid) (ans+=qucha(p<<1,l,r))%=mod;
if(r>mid) (ans+=qucha(p<<1|1,l,r))%=mod;
return ans;
}
signed main(){
n=read();
q=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
while(q--){
int op;
op=read();
if(op==1){
int l,r,x;
l=read();
r=read();
x=read();
quxiu(1,l,r,x);
}
else{
int l,r;
l=read();
r=read();
write(qucha(1,l,r)%mod);
puts("");
}
}
return 0;
}