1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 inline ll read()
5 {
6 ll x=0,f=1;
7 char ch=getchar();
8 while(ch<‘0‘||ch>‘9‘)
9 {
10 if(ch==‘-‘)
11 f=-1;
12 ch=getchar();
13 }
14 while(ch>=‘0‘&&ch<=‘9‘)
15 {
16 x=x*10+ch-‘0‘;
17 ch=getchar();
18 }
19 return x*f;
20 }
21 const ll N=100010;
22 ll a[N];
23 struct data
24 {
25 ll L,R;
26 ll sum;
27 bool flag;
28 }tree[N<<2];
29 ll n,m;
30 inline void buildtree(ll l,ll r,ll pos)
31 {
32 tree[pos].L=l;
33 tree[pos].R=r;
34 if(l==r)
35 {
36 tree[pos].sum=a[l];
37 if(a[l]==1||a[l]==0)
38 tree[pos].flag=1;
39 return;
40 }
41 ll mid=(l+r)/2;
42 buildtree(l,mid,pos*2);
43 buildtree(mid+1,r,pos*2+1);
44 tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum;
45 tree[pos].flag=tree[pos*2].flag&tree[pos*2+1].flag;
46 }
47 inline void update(ll l,ll r,ll pos)
48 {
49 if(tree[pos].flag)
50 return;
51 if(tree[pos].L==tree[pos].R)
52 {
53 tree[pos].sum=(ll)sqrt(tree[pos].sum);
54 if(tree[pos].sum==1||tree[pos].sum==0)
55 tree[pos].flag=1;
56 return;
57 }
58 ll mid=(tree[pos].L+tree[pos].R)/2;
59 if(mid>=r)
60 update(l,r,pos*2);
61 else if(mid<l)
62 update(l,r,pos*2+1);
63 else
64 {
65 update(l,mid,pos*2);
66 update(mid+1,r,pos*2+1);
67 }
68 tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum;
69 tree[pos].flag=tree[pos*2].flag&tree[pos*2+1].flag;
70 }
71 inline ll Query(ll l,ll r,ll pos)
72 {
73 if(tree[pos].L==l&&tree[pos].R==r)
74 return tree[pos].sum;
75 ll mid=(tree[pos].L+tree[pos].R)/2;
76 if(mid>=r)
77 return Query(l,r,pos*2);
78 else if(mid<l)
79 return Query(l,r,pos*2+1);
80 else
81 return Query(l,mid,pos*2)+Query(mid+1,r,pos*2+1);
82 }
83 int main()
84 {
85 n=read();
86 for(ll i=1;i<=n;i++)
87 a[i]=read();
88 buildtree(1,n,1);
89 m=read();
90 for(ll i=1;i<=m;i++)
91 {
92 ll pos,l,r;
93 pos=read();
94 l=read();
95 r=read();
96 if(l>r)
97 swap(l,r);
98 if(!pos)
99 update(l,r,1);
100 else
101 printf("%lld\n",Query(l,r,1));
102 }
103 return 0;
104 }