这是代码:
#include<bits/stdc++.h>
#define ls(x) x*2
#define rs(x) x*2+1
#define int long long
using namespace std;
int l[400010],r[400010],a[400010],sum[400010];bool tag[400010];//tag表示是否都为1
void pushup(int x){
/*if(tag[ls(x)]){
sum[ls(x)]=r[ls(x)]-l[ls(x)]+1;
}
if(tag[rs(x)]){
sum[rs(x)]=r[rs(x)]-l[rs(x)]+1;
}*/
tag[x]= (tag[ls(x)]&tag[rs(x)]);
sum[x]=sum[ls(x)]+sum[rs(x)];
}
void build(int x,int left,int right){
l[x]=left,r[x]=right;
if(left==right){
sum[x]=a[left];
return;
}
int mid=(left+right)/2;
build(ls(x),left,mid);
build(rs(x),mid+1,right);
pushup(x);
}
void update(int x,int left,int right){
if(tag[x])return;
if(l[x]==r[x]){
sum[x]=sqrt(sum[x]);
if(sum[x]==1)tag[x]=1;
return;
}
int mid=(r[x]+l[x])/2;
if(left<=mid)update(ls(x),left,right);
if(right>mid)update(rs(x),left,right);
pushup(x);
}
int query(int x,int left,int right){
if(l[x]==left&&r[x]==right){
return sum[x];
}
/* if(tag[x]){
return sum[x]=r[x]-l[x]+1;
}*/
int mid=(r[x]+l[x])/2;
int ans=0;
if(left<=mid)ans+=query(ls(x),left,min(mid,right));
if(right>mid)ans+=query(rs(x),max(mid+1,left),right);
return ans;
}
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}build(1,1,n);
int m;
cin>>m;
for(int i=1;i<=m;i++){
int k,l,r;
scanf("%d%d%d",&k,&l,&r);
if(l>r)swap(l,r);
if(k==0)update(1,l,r);
else printf("%lld\n",query(1,l,r));
}
return 0;
}