#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxN=400010;
int l[maxN],r[maxN],a[maxN],c[maxN];
bool tag[maxN];
int len(int k){
return r[k]-l[k]+1;
}
void pushup(int k){
c[k]=c[k*2]+c[k*2+1];
tag[k] = tag[k]&tag[k*2+1];
}
void build(int x,int y,int k){
l[k]=x,r[k]=y;
if(x==y){
c[k]=a[x];
return;
}
int mid=(x+y)/2;
build(x,mid,k*2);
build(mid+1,y,k*2+1);
pushup(k);
}
void update(int x,int y,int k){
if(tag[k])return;
if(l[k] == r[k]){
c[k]= sqrt(c[k]);
if(c[k] == 1)tag[k]=1;
return;
}
int mid=(l[k]+r[k])/2;
if(x<=mid) update(x,y,k*2);
if(y>mid) update(x,y,k*2+1);
pushup(k);
}
int query(int x,int y,int k){
if(x<=l[k] && r[k]<=y) return c[k];
int mid=(l[k]+r[k])/2,ans=0;
if(x<=mid) ans+=query(x,y,k*2);
if(y>mid) ans+=query(x,y,k*2+1);
return ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
long long n,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
cin>>m;
for(int i=1;i<=m;i++){
int op,x,y;
cin>>op>>x>>y;
if(x>y)swap(x,y);
if(op==1) cout<<query(x,y,1)<<"\n";
else update(x,y,1);
}
return 0;
}