代码只有50分
#include <bits/stdc++.h>
using namespace std;
int n, q;
const int maxn = 1e5+1;
int nod[maxn];
unsigned long long sum[maxn<<2], mma[maxn<<2];
void up(int n) {
sum[n] = sum[n<<1] + sum[n<<1|1];
mma[n] = max(mma[n<<1] , mma[n<<1|1]);
}
void build(int l, int r, int n) {
if(l == r){
sum[n] = nod[l];
mma[n] = nod[l];
return ;
}
int mid= (l +r) >>1;
build (l, mid, n<<1);
build(mid+1, r, n<<1|1);
up(n);
}
void cha(int a, int b, int l, int r, int n){
if(l == r&&a <= l&& r <= b) {
sum[n] = mma[n] = sqrt(sum[n]);
return;
}
int mid= ( l+ r) >>1;
if(mid >= a&& mma[n<<1] >1) cha(a, b, l, mid, n<<1);
if(mid < b&& mma[n<<1|1] >1) cha(a, b, mid+1, r, n<<1|1);
up(n);
}
unsigned long long ask(int a, int b,int l, int r, int n){
if(a <= l && r<= b) {
return sum[n];
}
int mid = (l+r) >>1; unsigned long long ans = 0;
if(mid>= a) ans+= ask(a, b, l, mid, n<<1);
if(mid < b) ans += ask(a, b, mid+1, r , n<<1|1);
return ans;
}
int main() {
//freopen ("ask.in", "r", stdin);
memset(mma, 0, sizeof(mma));
memset(sum, 0, sizeof(sum));
scanf("%d",&n);
for(int i = 1; i<= n;i++){
scanf("%d", &nod[i]);
}
build(1, n, 1);
scanf("%d", &q);
while(q--){
int a, b, m;
scanf("%d%d%d", &m , &a, &b);
if(a > b) swap(a, b);
if(m == 0) {
cha(a, b, 1, n, 1);
} if(m == 1){
printf("%lld\n", ask(a, b, 1, n, 1));
}
}
return 0;
}