#include<bits/stdc++.h>
using namespace std;
struct node{
long long l,r,tag,sum,mx;
}p[800010];
long long n,m;
long long l,r;
int read(){
int s=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')f=-1;
for(;isdigit(c);c=getchar())
s=s*10+c-'0';
return s*f;
}
long long siz(long long x){
return p[x].r-p[x].l+1;
}
void pushup(long long x){
if(p[x].l==p[x].r){
p[x].mx=p[x].sum;
return;
}
p[x].sum=p[2*x].sum+p[2*x+1].sum;
p[x].mx=max(p[2*x].mx,p[2*x+1].mx);
}
void pushdown(long long x){
if(p[x].mx<=1){
return;
}
if(p[x].l==p[x].r){
while(p[x].tag>0){
p[x].tag--;
p[x].sum=sqrt(p[x].sum);
}
p[x].mx=p[x].sum;
}else{
long long tag=p[x].tag;
long long lc=2*x,rc=2*x+1;
p[lc].tag+=tag;
p[rc].tag+=tag;
p[x].tag=0;
if(p[x].mx>1){
pushdown(2*x);
pushdown(2*x+1);
}
pushup(x);
}
}
void creat(long long x,long long l,long long r){
p[x].l=l;
p[x].r=r;
if(l==r){
p[x].sum=read();
p[x].mx=p[x].sum;
return;
}
long long mid=(l+r)/2;
creat(2*x,l,mid);
creat(2*x+1,mid+1,r);
pushup(x);
}
long long query(long long x){
if(p[x].l>r||p[x].r<l)return 0;
pushdown(x);
pushup(x);
if(l<=p[x].l&&p[x].r<=r){
return p[x].sum;
}
return query(2*x)+query(2*x+1);
}
void change(long long x){
if(p[x].l>r||p[x].r<l)return;
if(p[x].l>=l&&p[x].r<=r){
p[x].tag++;
return;
}
change(2*x);
change(2*x+1);
pushup(x);
}
int main(){
n=read();
creat(1,1,n);
m=read();
while(m--){
long long k=read();
l=read();
r=read();
if(l>r){
swap(l,r);
}
if(k==0){
change(1);
}else{
printf("%lld\n",query(1));
}
}
return 0;
}
评测记录