为什么写的和题解大佬差不多还会T啊
#include<bits/stdc++.h>
using namespace std;
long long n, m, a[100005], op, x, y;
struct node{
int l, r, id, sum;
bool tag;
}f[400005];
inline void build(int l, int r, int id){
f[id].l = l, f[id].r = r;
if(l == r){
f[id].sum = a[l];
if(f[id].sum == 1 || f[id].sum == 0)
f[id].tag = 1;
return;
}
int mid = (r + l) / 2;
build(l, mid, id * 2);
build(mid + 1, r, id * 2 + 1);
f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
f[id].tag = f[id * 2].tag & f[id * 2 + 1].tag;
}
inline void sqr(long long l, long long r, int id){
if(f[id].tag)
return;
if(f[id].l == f[id].r){
f[id].sum = floor(sqrt(f[id].sum));
if(f[id].sum == 1 || f[id].sum == 0)
f[id].tag = 1;
return;
}
if(r <= f[id * 2].r)
sqr(l, r, id * 2);
else
if(l >= f[id * 2 + 1].l)
sqr(l, r, id * 2 + 1);
else
sqr(l, f[id * 2].r, id * 2), sqr(f[id * 2 + 1].l, r, id * 2 + 1);
f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
f[id].tag = f[id * 2].tag & f[id * 2 + 1].tag;
}
inline int find(long long l, long long r, int id){
if(f[id].l == l && f[id].r == r)
return f[id].sum;
if(r <= f[id * 2].r)
return find(l, r, id * 2);
else
if(l >= f[id * 2 + 1].l)
return find(l, r, id * 2 + 1);
else
return find(l, f[id * 2].r, id * 2) + find(f[id * 2 + 1].l, r, id * 2 + 1);
}
int main(){
cin>>n;
for(int i = 1;i <= n;i++)
cin>>a[i];
build(1, n, 1);
cin>>m;
for(int i = 1;i <= m;i++){
scanf("%lld %lld %lld", &op, &x, &y);
if(x > y)
swap(x, y);
if(op == 0)
sqr(x, y, 1);
if(op == 1)
cout<<find(x, y, 1)<<endl;
}
return 0;
}