#include <algorithm>
#include <iostream>
#include <cmath>
#include <set>
#include <bitset>
#include <map>
#include <vector>
#include <list>
#include <queue>
#include <deque>
#include <array>
#include <bits/stl_pair.h>
class Node{
public:
int val, size;
int l, r;
};
Node tree[400005];
int w[100005];
void pushup(int k){
tree[k].val = tree[k << 1].val + tree[k << 1 | 1].val;
}
void build(int k, int l, int r){
tree[k].l = l, tree[k].r = r;
tree[k].size = r - l + 1;
if(l == r){
tree[k].val = w[l];
return ;
}
int mid = l + r >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
pushup(k);
return ;
}
void modify(int k, int l, int r){
if(tree[k].val == tree[k].size) return ;
if(tree[k].l == tree[k].r){
tree[k].val = sqrt(tree[k].val);
return ;
}
int mid = tree[k].l + tree[k].r >> 1;
if(l <= mid) modify(k << 1, l, mid);
if(mid < r) modify(k << 1 | 1, mid + 1, r);
pushup(k);
return ;
}
int query(int k, int l, int r){
if(l <= tree[k].l && tree[k].r <= r) return tree[k].val;
int mid = tree[k].l + tree[k].r >> 1, ans = 0;
if(l <= mid) ans += query(k << 1, l, r);
if(mid < r) ans += query(k << 1 | 1, l, r);
return ans;
}
int main(){
int n;
std::cin >> n;
for(int i = 1; i <= n; ++i) std::cin >> w[i];
build(1, 1, n);
int q;
std::cin >> q;
while(q--){
int opt, l, r;
std::cin >> opt >> l >> r;
if(l > r) l ^= r ^= l ^= r;
if(opt == 0) modify(1, l, r);
else std::cout << query(1, l, r) << '\n';
}
return 0;
}