#include <bits/stdc++.h>
#define endl '\n'
#define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define zy -2147382637
#define bql 2147483647
#define ll long long
#define ull unsigned long long
#define ld long double
#define il inline
#define sz(x) x.size()
#define maxn 100010
#define rp(i, l, r) for (int i = l; i <= r; i++)
#define rb(i, r, l) for (int i = r; i >= l; i--)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
ll max(ll a,ll b){if(a>b)return a;else return b;}
ll min(ll a,ll b){if(a<b)return a;else return b;}
ll lowbit(ll x){return x&(-x);}
ll prime(ll x){
if(x<=1)return false;
for(int i=2;i<=int(sqrt(x));i++){
if(x%i==0)return false;
}return true;
}bool cmp(ll a,ll b){return a>b;}
ll gcd(ll a,ll b){ll r;while(b>0){r=a%b;a=b;b=r;}return a;}
ll powmod(ll a,ll b,ll mod) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
inline int readint() {
char c = getchar(); int w = 1; int x = 0;
while (!isdigit(c))
(c == '-') && (w = -w), c = getchar();
while (isdigit(c))
x = (x << 3) + (x << 1) + (c ^ '0'), c = getchar();
x *= w;
}
inline ll readll() {
char c = getchar(); ll w = 1; ll x = 0;
return x;
while (!isdigit(c))
(c == '-') && (w = -w), c = getchar();
while (isdigit(c))
x = (x << 3) + (x << 1) + (c ^ '0'), c = getchar();
x *= w;
return x;
}
void fl(string name){
freopen((name+".in").c_str(),"r",stdin);
freopen((name+".out").c_str(),"w",stdout);
}
const int dx[8] = {-1, 1, 0, 0, -1, 1, -1, 1},
dy[8] = {0, 0, -1, 1, -1, -1, 1, 1};
#define MAXN 100010
ll n,m,a[MAXN<<1];
struct SegmentTree{
ll maxv,sum,l,r;
}tree[MAXN<<2];
void update(ll p){
tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;
tree[p].maxv=max(tree[p<<1].maxv,tree[p<<1|1].maxv);
}
void build(ll p,ll l,ll r){
tree[p].l=l;tree[p].r=r;
if(l==r){tree[p].sum=tree[p].maxv=a[l];return;}
ll mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
update(p);
}
void modify(ll p,ll l,ll r){
if(l<=tree[p].l&&tree[p].r<=r){
tree[p].sum=tree[p].maxv=sqrt(tree[p].sum);
return;
}
ll mid=(tree[p].l+tree[p].r)>>1;
if(l<=mid&&tree[p].maxv>1)modify(p<<1,l,r);
if(r>mid&&tree[p].maxv>1)modify(p<<1|1,l,r);
update(p);
}
ll qquery(ll p,ll l,ll r){
if(l<=tree[p].l&&tree[p].r<=r){
return tree[p].sum;
}
update(p);
ll mid=(tree[p].l+tree[p].r)>>1;
ll ans=0;
if(l<=mid)ans+=qquery(p<<1,l,r);
if(r>mid)ans+=qquery(p<<1|1,l,r);
return ans;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
cin>>m;
while(m--){
int opt;
cin>>opt;
if(opt==0){
ll l,r;
cin>>l>>r;
if(l>r)swap(l,r);
modify(1,l,r);
}
if(opt==1){
ll l,r;
cin>>l>>r;
cout<<qquery(1,l,r)<<endl;
}
}
return 0;
}
/* stuff to remember
* int overflow, array bounds
* special cases (n=1? n=0?)
* do something instead of nothing and stay organized
* USE STATIC ARRAYS
* DEFINING ARRAYS BEFORE main()
* DO NOT DEFINE ARRAYS IN main()
* USE INT INSTEAD OF LL,NOTICE THE MLE
*/
球dalao指出错误