#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define fast ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
// #define T int t;cin>>t;while(t--)
#define F first
#define S second
#define endl '\n'
#define int long long
using namespace std;
using namespace __gnu_pbds;


template <typename T>
using ordered_set = tree<
    T,
    null_type,
    less<T>,
    rb_tree_tag,
    tree_order_statistics_node_update
>;

template <typename T>
using ordered_set_desc = tree<
    T,
    null_type,
    greater<T>,
    rb_tree_tag,
    tree_order_statistics_node_update
>;

const int N = 1e6+6;
vector<int> d(N,1);
void siave() {
    for (int i=2;i<N;i++) {
        for (int j=i;j<N;j+=i) {
            d[j]++;
        }
    }
}


struct BIT {
    int n;
    vector<int> arr;
    BIT(int _n) {
        n = _n;
        arr.assign(n+1, 0);
    }

    void add(int idx,int v) {
        while (idx <= n) {
            arr[idx] += v;
            idx += (idx & -idx);
        }
    }

    int get(int idx) {
        int ans = 0;
        while (idx > 0) {
            ans += arr[idx];
            idx -= (idx & -idx);
        }
        return ans;
    }

    int get(int l, int r) {
        return get(r) - get(l-1);
    }

    void set(int idx, int v) {
        int old = get(idx,idx);
        add(idx, -old + v);
    }
};


void Abady() {
    siave();
    int n, q; cin >> n >> q;
    BIT bit(n);
    ordered_set<int> st;
    for (int i=1;i<=n;i++) {
        int x; cin >> x;
        bit.add(i,x);
        if (x > 1) st.insert(i);
    }
    while (q--) {
        int op; cin >> op;
        if (op == 1) {
            int l,r; cin >> l >> r;
            if (st.empty()) continue;
            int k = *st.lower_bound(l);
            int j = st.order_of_key(k);
            while (k <= r) {
                int num = bit.get(k,k);
                num = d[num];
                bit.set(k,num);
                if (num == 1) st.erase(k);
                if (j+1 < st.size()) k = *st.find_by_order(++j);
                else break;
            }
        }
        else {
            int l,r; cin >> l >> r;
            cout << bit.get(l,r) << endl;
        }
    }
}


signed main() {
    fast;
    Abady();
}