#include <bits/stdc++.h>
using namespace std;
int n, m, G[5555555], P[5555555], tree[5555555];
long long sum[5555555];
int read() {
  char c = getchar();
  int ans = 0;
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9')
    ans = (ans << 1) + (ans << 3) + (c ^ 48), c = getchar();
  return ans;
}
void buildtree(int L, int R, int rt) {
  if (L == R) {
    tree[rt] = sum[rt] = G[L];
    return;
  }
  int mid = (L + R) >> 1;
  buildtree(L, mid, rt << 1);
  buildtree(mid + 1, R, rt << 1 | 1);
  tree[rt] = max(tree[rt << 1], tree[rt << 1 | 1]);
  sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
  return;
}
void change(int L, int R, int l, int r, int rt) {
  if (L == R) {
    G[L] = P[G[L]];
    tree[rt] = sum[rt] = G[L];
    return;
  }
  if (tree[rt] <= 2) return;
  int mid = (L + R) >> 1;
  if (mid >= l) change(L, mid, l, r, rt << 1);
  if (mid < r) change(mid + 1, R, l, r, rt << 1 | 1);
  tree[rt] = max(tree[rt << 1], tree[rt << 1 | 1]);
  sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
  return;
}
long long query(int L, int R, int l, int r, int rt) {
  if (l <= L && R <= r) return sum[rt];
  if (l > R || L > r) return 0;
  int mid = (L + R) >> 1;
  return query(L, mid, l, r, rt << 1) + query(mid + 1, R, l, r, rt << 1 | 1);
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= 1000000; i++) {
    P[i] = 1;
    int k = i;
    for (int j = 2; j * j <= k; j++) {
      int now = 0;
      while (k % j == 0) k /= j, ++now;
      P[i] *= (now + 1);
    }
    if (k != 1) P[i] <<= 1;
  }
  for (int i = 1; i <= n; i++) G[i] = read();
  buildtree(1, n, 1);
  for (int i = 1, x, y, z; i <= m; i++) {
    x = read(), y = read(), z = read();
    if (x == 1)
      change(1, n, y, z, 1);
    else
      printf("%lld\n", query(1, n, y, z, 1));
  }
  return 0;
}
