#include<bits/stdc++.h>
#define lid tr[id].l
#define rid tr[id].r
using namespace std;
const int maxn=500010;
const int MAXN=40000010;
int n,m,a[maxn],q[maxn],op,l,r,x;
vector<int> g[maxn];
long long num;
struct FHQ{
int l,r;
int root,size,v,p;
}tr[MAXN];
long long cnt,cur;
int add(int x){
num++;
tr[num].l=tr[num].r=0;
tr[num].size=1;
tr[num].p=rand();
tr[num].v=x;
return num;
}
void pushup(int id){
tr[id].size=tr[lid].size+tr[rid].size+1;
}
void split_v(int id,int x,int &l,int &r){
if(!id){
l=r=0;
return;
}
if(tr[id].v<=x){
split_v(rid,x,rid,r);
l=id;
}else{
split_v(lid,x,l,lid);
r=id;
}
pushup(id);
}
void split_s(int id,int x,int &l,int &r){
if(!id){
l=r=0;
return;
}
if(tr[lid].size>=x){
split_s(lid,x,l,lid);
r=id;
}else{
split_s(rid,x-tr[lid].size-1,rid,r);
l=id;
}
pushup(id);
}
int build(int l,int r,int*p){
if(l>r) return 0;
int mid=(l+r)>>1;
int v=p[mid];
int ret=add(v);
tr[ret].l=build(l,mid-1,p);
tr[ret].r=build(mid+1,r,p);
pushup(ret);
return ret;
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
if(tr[x].p>tr[y].p){
tr[x].r=merge(tr[x].r,y);
pushup(x);
return x;
}else{
tr[y].l=merge(tr[y].l,x);
pushup(y);
return y;
}
}
#define bit(x) x&(-x)
long long sum[maxn];
void modify(int x,int v){
while(x<=n){
sum[x]+=v;
x+=bit(x);
}
}
long long query(int x){
long long res=0;
while(x){
res+=sum[x];
x-=bit(x);
}
return res;
}
void dfs(int id,int v){
if(!id) return;
if(lid) dfs(lid,v);
if(a[tr[id].v]%v==0){
modify(tr[id].v,-a[tr[id].v]);
a[tr[id].v]/=v;
modify(tr[id].v,a[tr[id].v]);
q[++cnt]=tr[id].v;
}
if(rid) dfs(rid,v);
}
void del(int x,int l,int r){
int a,b,c;
split_v(tr[x].root,r,b,c);
split_v(b,l-1,a,b);
cur=0;
int t=0;
dfs(b,x);
t=build(1,cur,q);
tr[x].root=merge(a,merge(t,c));
}
int main(){
srand(time(0));
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
modify(i,a[i]);
}
for(int i=1;i<=n;i++){
for(int j=1;j*j<=a[i];j++){
if(a[i]%j==0){
g[j].push_back(i);
if(j*j!=a[i]) g[a[i]/j].push_back(i);
}
}
}
for(int i=1;i<=500000;i++){
cur=0;
for(vector<int>::iterator it=g[i].begin();it!=g[i].end();it++) q[++cur]=*it;
tr[i].root=build(1,cur,q);
}
for(int i=1;i<=m;i++){
cin>>op>>l>>r;
if(op==1){
cin>>x;
if(x>1) del(x,l,r);
}else{
cout<<query(r)-query(l-1)<<endl;
}
}
return 0;
}