#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,mxa=0,a[300005],d[1000006],bit[300005];
multiset <int> mse;
void UPDATE(int i, int v)
{
    while (i<=n) bit[i]+=v,i+=i&(-i);
    return;
}
int GET(int l, int r)
{
    l--;
    int resl=0,resr=0;
    while (l>0) resl+=bit[l],l-=l&(-l);
    while (r>0) resr+=bit[r],r-=r&(-r);
    return resr-resl;
}
signed main()
{
    ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for (int i=1;i<=n;i++) cin>>a[i],mxa=max(mxa,a[i]),UPDATE(i,a[i]);
    for (int i=1;i<=mxa;i++) for (int j=i;j<=mxa;j+=i) d[j]++;
    for (int i=1;i<=n;i++)
    {
        int cnt=0,vl=a[i];
        while (vl>2) cnt++,vl=d[vl];
        for (int j=1;j<=cnt;j++) mse.insert(i);
    }
    for (int i=1;i<=m;i++)
    {
        int t,l,r;
        cin>>t>>l>>r;
        if (t==1)
        {
            int idx=l;
            while (*mse.lower_bound(idx)>=l && *mse.lower_bound(idx)<=r)
            {
                idx=*mse.lower_bound(idx);
                UPDATE(idx,d[a[idx]]-a[idx]),a[idx]=d[a[idx]];
                if (mse.find(idx)!=mse.end()) mse.erase(mse.find(idx));
                if (mse.upper_bound(idx)==mse.end()) break;
                else idx=*mse.upper_bound(idx);
            }
        }
        else cout<<GET(l,r)<<'\n';
    }
    return 0;
}
