func_code_string: #include <bits/stdc++.h>   using namespace std;   int cnt[1000010] = {};   void pre() {     for (int i = 1; i < 1000010; i++) {       for (int j = i; j < 1000010; j += i) {         cnt[j]++;       }     }   }   long long int tree[2 * 1000010];   int n;   void build() {     for (int i = n - 1; i > 0; i--) {       tree[i] = tree[i << 1] + tree[(i << 1) | 1];     }   }   void update(int idx, long long int val) {     tree[idx + n] = val;     for (int i = idx + n; i > 0; i >>= 1) {       tree[i >> 1] = tree[i] + tree[i ^ 1];     }   }   long long int query(int l, int r) {     long long int ans = 0;     l += n;     r += n;     for (; l < r; l >>= 1, r >>= 1) {       if (l & 1) {         ans += tree[l];         l++;       }       if (r & 1) {         r--;         ans += tree[r];       }     }     return ans;   }   int main() {     pre();     int m;     scanf( %d%d , &n, &m);     for (int i = 0; i < n; i++) {       scanf( %lld , &tree[n + i]);     }     build();     set<int> s;     for (int i = 0; i < n; i++) {       if (tree[n + i] > 2) {         s.insert(i);       }     }     while (m--) {       int t, l, r;       scanf( %d %d %d , &t, &l, &r);       l--;       r--;       if (t == 2) {         printf( %lld n , query(l, r + 1));       } else {         l--;         vector<int> v;         if (s.empty()) {           continue;         }         if (s.upper_bound(l) == s.end()) {           continue;         }         int idx = *s.upper_bound(l);         while (idx <= r) {           s.erase(idx);           long long int x = tree[n + idx];           update(idx, (long long int)cnt[x]);           if (cnt[x] > 2) {             v.push_back(idx);           }           if (s.empty()) {             break;           }           if (s.upper_bound(l) == s.end()) {             break;           }           idx = *s.upper_bound(l);         }         for (int u : v) {           s.insert(u);         }       }     }     return 0;   }   