#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5,M=5e6+5;
int n,m,op,l,r,d[M],cnt;
struct ltree
{
int l,r,mx,sum;
}s[6000005];
int read()
{
char c=getchar();
int r=0,f=1;
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') r=(r<<1)+(r<<3)+c-48,c=getchar();
return r*f;
}
void make_d()
{
for(int i=1;i<=M-5;i++)
for(int j=i;j<=M-5;j+=i)
d[j]++;
}
int ls(int x)
{
return x<<1;
}
int rs(int x)
{
return x<<1|1;
}
void push_up(int p)
{
s[p].mx=max(s[ls(p)].mx,s[rs(p)].mx);
s[p].sum=s[ls(p)].sum+s[rs(p)].sum;
}
void build(int l,int r,int p)
{
s[p].l=l;
s[p].r=r;
if(l==r)
{
s[p].mx=s[p].sum=read();
return ;
}
int mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
void update(int p)
{
if(s[p].l>r||s[p].r<l) return ;
if(s[p].mx<=2) return ;
if(s[p].l==s[p].r)
{
s[p].sum=s[p].mx=d[s[p].sum];
return ;
}
update(ls(p));
update(rs(p));
push_up(p);
}
int query(int p)
{
if(s[p].l>r||s[p].r<l) return 0;
if(s[p].l>=l&&s[p].r<=r) return s[p].sum;
return query(ls(p))+query(rs(p));
}
signed main()
{
n=read(); m=read();
build(1,n,1);
make_d();
while(m--)
{
op=read(); l=read(); r=read();
if(op==1) update(1);
else printf("%d\n",query(1));
}
}