#include <bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define int long long
template<typename T> inline void rd(T &x)
{
int w = 1;x = 0; char s;
while (!isdigit(s = getchar())) if (s == '-') w = -1;
while (isdigit(s)) x = (x << 3) + (x << 1), x += s - '0', s = getchar();
x *= w;
}
template<typename T> inline void we(T x) {
static int sta[35];
int top = 0;
do {
sta[top++] = x % 10, x /= 10;
} while (x);
while (top) putchar(sta[--top] + 48);
}
struct SGtree{
int val, tag, l, r;
#define val(x) tr[x].val
#define tag(x) tr[x].tag
#define l(x) tr[x].l
#define r(x) tr[x].r
}tr[MAXN << 2];
int value[MAXN], n, ans, m;
inline void build(int x, int l, int r){
l(x) = l, r(x) = r;
if (l == r)
{
val(x) = value[l];
return;
}
int mid = (l + r) >> 1;
build(x * 2, l, mid);
build(x * 2 + 1, mid + 1, r);
val(x) = val(x * 2) + val(x * 2 + 1);
}
inline void change(int x, int l, int r){
if (l(x) >= l && r(x) <= r)
{
tag(x)++;
return;
}
int mid = (l(x) + r(x)) >> 1;
if (l <= mid) change(x * 2, l, r);
if (r > mid) change(x * 2 + 1, l, r);
}
inline void query(int x, int l, int r, int tap){
if (l(x) >= l && r(x) <= r)
{
if (tap + tag(x) >= 6)
{
ans += (r(x) - l(x) + 1);
return;
}
}
if (l(x) == r(x))
{
int v = val(x);
for (register int i = 1; i <= tap + tag(x); i++)
{
v = sqrt(v);
}
ans += v;
return;
}
int mid = (l(x) + r(x)) >> 1;
if (l <= mid) query(x * 2, l, r, tag(x) + tap);
if (r > mid) query(x * 2 + 1, l, r, tag(x) + tap);
}
signed main(){
rd(n);
for (register int i = 1; i <= n; i++) rd(value[i]);
build(1, 1, n);
rd(m);
for (register int i = 1; i <= m; i++){
int x;
rd(x);
if (x == 1)
{
int l, r;
rd(l);rd(r);
if (l > r) swap(l, r);
ans = 0;
query(1, l, r, 0);
we(ans);
puts("");
}
else
{
int l, r;
rd(l);rd(r);
if (l > r) swap(l, r);
change(1, l, r);
}
}
}