玄关,求条
#include<math.h>
#include<iostream>
using namespace std;
long long t[400001];
long long bb[400001];
int n,m;
void plant(int le,int re,int po){
if(le==re){
t[po]=bb[le];
}
else{
int m=(le+re)/2;
plant(le, m, po*2);
plant( m+1, re,po*2+1);
t[po]=t[po*2]+t[po*2+1];
}
return ;
}
void tree_sqrt(int l,int r,int le,int re,int po){
if(re<l || r<le ) return ;
if(l==r){
t[po]=sqrt(t[po]);
return;
}
int mid=(l+r)/2;
tree_sqrt(l,mid,le,re,po*2);
tree_sqrt(mid+1,r,le,re,po*2+1);
t[po]=t[po*2]+t[po*2+1];
return ;
}
long long tree_sum(int l,int r,int le,int re,int po){
// cout<<po<<"-->"<<t[po]<<" ";
if(re<l || r<le){
return 0;
}
if(le<=l&&r<=re){
return t[po];
}
int mid=(l+r)/2;
return (tree_sum(l,mid,le,re,po*2)+tree_sum(mid+1,r,le,re,po*2+1));
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&bb[i]);
}scanf("%d",&m);
plant(1,n,1);
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
int l,r;
scanf("%d %d",&l,&r);
if(l>r) swap(l,r);
if(x==0){
tree_sqrt(1,n,l,r,1);
}
else {
printf("%lld\n",tree_sum(1,n,l,r,1));
}
}
return 0;
}