#include <bits/stdc++.h>   using namespace std;   inline long long read() {     char ch = getchar();     long long s = 0, w = 1;     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) w = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       s = s * 10 + ch -  0 ;       ch = getchar();     }     return s * w;   }   int d[1000010], t[1000010], prime[1000010], tot, vis[1000010];   int n, fa[1000010], a[1000010], m;   long long c[1000010];   inline void prepare(int Maxn) {     d[1] = 1;     for (register int i = 2; i <= Maxn; i++) {       if (!vis[i]) {         prime[++tot] = i;         t[i] = d[i] = 2;       }       for (register int j = 1; 1LL * prime[j] * i <= Maxn; j++) {         vis[i * prime[j]] = 1;         if (i % prime[j]) {           d[i * prime[j]] = d[i] * 2;           t[i * prime[j]] = 2;         } else {           d[i * prime[j]] = d[i] / t[i] * (t[i] + 1);           t[i * prime[j]] = t[i] + 1;           break;         }       }     }   }   inline void add(int x, int v) {     for (; x <= n; x += x & (-x)) c[x] += v;   }   inline long long query(int x) {     long long sum = 0;     for (; x; x -= x & (-x)) sum += c[x];     return sum;   }   int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }   int main() {     prepare(1000010 - 10);     n = read(), m = read();     for (register int i = 1; i <= n; i++) a[i] = read(), fa[i] = i;     fa[n + 1] = n + 1;     for (register int i = 1; i <= n; i++) add(i, a[i]);     while (m--) {       int opt = read(), l = read(), r = read();       if (opt == 1) {         for (register int i = l; i <= r; i = find(i + 1)) {           add(i, d[a[i]] - a[i]);           a[i] = d[a[i]];           if (a[i] == 2 || a[i] == 1) fa[find(i)] = find(i + 1);         }       } else {         printf( %lld n , query(r) - query(l - 1));       }     }     return 0;   }   