#include<bits/stdc++.h>
#define lchild (root << 1)
#define rchild ((root << 1) + 1)
#define mid ((l + r) >> 1)
using namespace std;
typedef long long ll;
const int N = 1e5 + 9;
int n,m;
ll a[N];
struct node{
ll sum,Max;
} t[N << 2];
bool in_range(int l,int r,int L,int R){
return L <= l && r <= R;
}
bool out_range(int l,int r,int L,int R){
return L > r || l > R;
}
void push_up(int root){
t[root].sum = t[lchild].sum + t[rchild].sum;
t[root].Max = max(t[lchild].Max,t[rchild].Max);
}
void build(int root,int l,int r){
if(l == r){
t[root].sum = t[root].Max = a[l];
return;
}
build(lchild,l,mid);
build(rchild,mid + 1,r);
push_up(root);
}
void update(int root,int l,int r,int L,int R){
if(t[root].Max == 1)
return;
if(l == r){
t[root].sum = t[root].Max = (ll)sqrt(t[root].sum);
return;
}
if(!out_range(l,r,L,R)){
update(lchild,l,mid,L,R);
update(rchild,mid + 1,r,L,R);
}
push_up(root);
}
ll query(int root,int l,int r,int L,int R){
if(in_range(l,r,L,R))
return t[root].sum;
if(!out_range(l,r,L,R))
return query(lchild,l,mid,L,R) + query(rchild,mid + 1,r,L,R);
return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++)
cin >> a[i];
build(1,1,n);
cin >> m;
for(int i = 1;i <= m;i++){
int k,l,r;
cin >> k >> l >> r;
if(l > r)
swap(l,r);
if(k == 0)
update(1,1,n,l,r);
else
cout << query(1,1,n,l,r) << '\n';
}
return 0;
}