这是代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<deque>
#include<map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+10,M=1e5+10;
const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
ll n,m;
ll a[N];
struct node{
int l,r;
ll sum,maxn;
}t[4*N];
void pushup(int p){
int l=p<<1,r=p<<1|1;
t[p].sum=t[l].sum+t[r].sum;
t[p].maxn=max(t[l].maxn,t[r].maxn);
}
void buildtree(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sum=t[p].maxn=a[l];
return;
}
int mid=(l+r)>>1;
buildtree(p<<1,l,mid);
buildtree(p<<1|1,mid+1,r);
pushup(p);
}
void update(int p,int l,int r){
if(t[p].l==t[p].r){
t[p].sum=sqrt(t[p].sum);
t[p].maxn=sqrt(t[p].maxn);
return;
}
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid&&t[p<<1].sum>1)update(p<<1,l,r);
if(mid<r&&t[p<<1|1].sum>1)update(p<<1|1,l,r);
pushup(p);
}
ll query(int p,int l,int r){
if(l<=t[p].l&&t[p].r<=r)return t[p].sum;
int mid=(t[p].l+t[p].r)>>1;
ll ans=0;
if(l<=mid)ans+=query(p<<1,l,r);
if(mid<r)ans+=query(p<<1|1,l,r);
return ans;
}
int main(){
// freopen("xxx.in","r",stdin);
// freopen("xxx.out","w",stdout);
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
buildtree(1,1,n);
m=read();
while(m--){
int op,l,r;
op=read(),l=read(),r=read();
if(l>r)swap(l,r);
if(op==0)update(1,l,r);
else printf("%lld\n",query(1,l,r));
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
马蜂丑陋,还请见谅