#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m,a[N];
struct node{
int l,r,sum,maxx;
}tree[N*4];
inline int read(){
register int w=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){
w=(w<<3)+(w<<1)+ch-'0';
ch=getchar();
}
return w;
}
inline int ll(int x){
return x*2;
}
inline int rr(int x){
return x*2+1;
}
inline void push_up(node &x,node &l,node &r){
x.l=l.l;
x.r=r.r;
x.sum=l.sum+r.sum;
x.maxx=max(l.maxx,r.maxx);
}
inline void push_up(int x){
push_up(tree[x],tree[ll(x)],tree[rr(x)]);
}
inline void build(int x,int l,int r){
if(l==r){
tree[x]={l,l,a[l],a[l]};
return;
}
int mid=l+r>>1;
build(ll(x),l,mid);
build(rr(x),mid+1,r);
push_up(x);
}
inline int querymax(int x,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r) return tree[x].maxx;
int res=0;
int mid=(tree[x].l+tree[x].r)>>1;
if(l<=mid) res=max(res,querymax(ll(x),l,r));
if(r>mid) res=max(res,querymax(rr(x),l,r));
return res;
}
inline void update(int x,int l,int r){
if(querymax(1,l,r)==1) return ;
if(tree[x].l==tree[x].r&&tree[x].l>=l&&tree[x].r<=r){
tree[x].sum=sqrt(tree[x].sum);
tree[x].maxx=sqrt(tree[x].maxx);
return ;
}
int mid=(tree[x].l+tree[x].r)>>1;
if(l<=mid) update(ll(x),l,r);
if(r>mid) update(rr(x),l,r);
push_up(x);
}
inline int query(int x,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r) return tree[x].sum;
int res=0;
int mid=(tree[x].l+tree[x].r)>>1;
if(l<=mid) res+=query(ll(x),l,r);
if(r>mid) res+=query(rr(x),l,r);
return res;
}
signed main()
{
cin>>n;
for(register int i=1;i<=n;++i){
a[i]=read();
}
cin>>m;
build(1,1,n);
while(m--){
int op,l,r;
op=read();
l=read();
r=read();
if(l>r) swap(l,r);
if(op==0){
update(1,l,r);
}
if(op==1){
printf("%lld\n",query(1,l,r));
}
}
return 0;
}