#2 TLE 蒟蒻不知道哪里写挂了 求大佬帮调
#include <stdio.h>
#define int long long
long long stree[1200010],stmax[1200010];
int d[1000010],a[300010];
inline int max(int x, int y){
return x>y?x:y;
}
void pushup(int x){
stree[x]=stree[x<<1]+stree[x<<1|1];
stmax[x]=max(stmax[x<<1],stmax[x<<1|1]);
return;
}
void build(int x, int l, int r){
int mid=l+r>>1;
if (l==r){
stree[x]=stmax[x]=a[l];
return;
}
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
return pushup(x);
}
void change(int x, int l, int r, int c){
int mid=l+r>>1;
if (r<c||l>c) return;
if (l==r&&r==c){
stree[x]=stmax[x]=d[stree[x]];
return;
}
if (c<=mid) change(x<<1,l,mid,c);
if (c>mid) change(x<<1|1,mid+1,r,c);
pushup(x);return;
return;
}
int query(int x, int l, int r, int ql, int qr){
if (r<ql||l>qr) return 0;
int mid=l+r>>1;
if (ql<=l&&r<=qr){
return stree[x];
}
int ret=0;
if (ql<=mid) ret+=query(x<<1,l,mid,ql,qr);
if (qr>mid) ret+=query(x<<1|1,mid+1,r,ql,qr);
return ret;
}
signed main(){
for (int i=1;i<=1000000;i++){
for (int j=0;j<=1000000;j+=i){
d[j]++;
}
}
int n,m;
scanf("%lld%lld",&n,&m);
for (int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
for (int i=1;i<=m;i++){
int k,l,r;
scanf("%lld%lld%lld",&k,&l,&r);
if (k==1){
for (int j=l;j<=r;j++){
change(1,1,n,j);
}
}else{
printf("%lld\n",query(1,1,n,l,r));
}
}
return 0;
}