#include<cmath>
#include<iostream>
#include<algorithm>
#define ls (rt<<1)
#define rs (rt<<1)|1
#define il inline
typedef long long ll;
using namespace std;
struct node{
ll maxn,sum;
}t[2000005];
ll a[2000005];
inline int read(){
int x=0,w=1;
char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
il void update(ll rt){
t[rt].maxn=max(t[ls].maxn,t[rs].maxn);
t[rt].sum=t[ls].sum+t[rs].sum;
}
il void build(ll rt,ll l,ll r){
if(l==r){
t[rt].maxn=t[rt].sum=a[l];
return ;
}
ll mid=(r+l)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
update(rt);
}
il void change(ll rt,ll l,ll r,ll L,ll R){
if(l==r && l>=L && r<=R){
t[rt].sum=t[rt].sum=sqrt(t[rt].sum);
return ;
}
ll mid=(r+l)>>1;
if(L<=mid && t[ls].maxn>1)change(ls,l,mid,L,R);
if(mid<R && t[rs].maxn>1)change(rs,mid+1,r,L,R);
update(rt);
}
il ll query(ll rt,ll l,ll r,ll l1,ll r1){
if(l1<=l&&r<=r1){
return t[rt].sum;
}
ll mid=(r+l)>>1;
ll ans=0;
if(l1<=mid)ans+=query(ls,l,mid,l1,r1);
if(r1>mid)ans+=query(rs,mid+1,r,l1,r1);
return ans;
}
int main(){
ll n,m;
n=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
m=read();
while(m--){
ll op,l,r;
op=read(),l=read(),r=read();
if(l>r)swap(l,r);
if(op)cout<<query(1,1,n,l,r)<<"\n";
else change(1,1,n,l,r);
}
return 0;
}