1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4
5 using namespace std;
6
7 const int maxn=1e6+10;
8 struct node
9 {
10 int l,r;
11 long long sum,maxx;
12 }tree[maxn];
13 long long n;
14 long long num[maxn];
15 long long pushup(long long x)
16 {
17 tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
18 if(tree[x<<1].maxx>tree[x<<1|1].maxx)
19 {
20 tree[x].maxx=tree[x<<1].maxx;
21 }
22 else
23 {
24 tree[x].maxx=tree[x<<1|1].maxx;
25 }
26 }
27 void build(long long x,long long l,long long r)
28 {
29 tree[x].l=l;
30 tree[x].r=r;
31 if(l==r)
32 {
33 tree[x].sum=tree[x].maxx=num[l];
34 return ;
35 }
36 int mid=(l+r)>>1;
37 build(x<<1,l,mid);
38 build(x<<1|1,mid+1,r);
39 pushup(x);
40 }
41 void modify(long long x,long long l,long long r)
42 {
43 if(tree[x].l==tree[x].r)
44 {
45 tree[x].sum=sqrt(tree[x].sum);
46 tree[x].maxx=sqrt(tree[x].maxx);
47 return ;
48 }
49 long long mid=(tree[x].l+tree[x].r)>>1;
50 if(l<=mid&&tree[x<<1].maxx>1)
51 {
52 modify(x<<1,l,r);
53 }
54 if(r>mid&&tree[x<<1|1].maxx>1)
55 {
56 modify(x<<1|1,l,r);
57 }
58 pushup(x);
59 }
60 long long query(long x,long long l,long long r)
61 {
62 if(l<=tree[x].l&&r>=tree[x].r)
63 {
64 return tree[x].sum;
65 }
66 long long mid=(tree[x].l+tree[x].r)>>1;
67 long long ans=0;
68 if(l<=mid)
69 {
70 ans+=query(x<<1,l,r);
71 }
72 if(r>mid)
73 {
74 ans+=query(x<<1|1,l,r);
75 }
76 return ans;
77 }
78 int main()
79 {
80 cin>>n;
81 for(long long i=1;i<=n;i++)
82 {
83 cin>>num[i];
84 }
85 build(1,1,n);
86 long long m,opt,l,r;
87 cin>>m;
88 while(m--)
89 {
90 cin>>opt>>l>>r;
91 if(l>r)
92 {
93 swap(l,r);
94 }
95 if(opt==0)
96 {
97 modify(1,l,r);
98 }
99 else
100 {
101 cout<<query(1,l,r)<<endl;
102 }
103 }
104 return 0;
105 }