#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1e5 + 10;
int n, aa[N], m;
inline long long read(){
register long long sum = 0, zf = 1;
register char ch;
ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
zf = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9'){
sum = sum * 10 + ch - '0';
ch = getchar();
}
return sum * zf;
}
struct node{
int l, r;
long long sum;
}a[N * 4];
void build(int l, int r, int p){
a[p].l = l;
a[p].r = r;
if(l == r){
a[p].sum = aa[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, p * 2);
build(mid + 1, r, p * 2 + 1);
a[p].sum = a[p * 2].sum + a[p * 2 + 1].sum;
}
long long ask(int l, int r, int p){
if(l <= a[p].l && a[p].r <= r)
return a[p].sum;
int mid = (a[p].l + a[p].r) >> 1;
long long ans = 0;
if(l <= mid)
ans += ask(l, r, p * 2);
if(r > mid)
ans += ask(l, r, p * 2 + 1);
return ans;
}
void change(int x, int p){
if(a[p].l == a[p].r){
a[p].sum = sqrt(a[p].sum);
aa[a[p].l] = sqrt(aa[a[p].l]);
return;
}
int mid = (a[p].l + a[p].r) >> 1;
if(x <= mid)
change(x, p * 2);
else
change(x, p * 2 + 1);
a[p].sum = a[p * 2].sum + a[p * 2 + 1].sum;
}
int main(){
n = read();
for(int i = 1; i <= n; i++)
aa[i] = read();
build(1, n, 1);
m = read();
while(m--){
int x, l, r;
x = read();
l = read();
r = read();
if(l > r)
swap(l, r);
if(x == 1)
printf("%lld\n", ask(l, r, 1));
else{
for(int i = l; i <= r; i++)
if(aa[i] != 1 && aa[i] != 0)
change(i, 1);
}
}
return 0;
}