球珠!
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cmath"
using namespace std;
#define read(x) scanf("%d",&x)
#define ll long long
#define MAXN 100005
struct node
{
ll l,r,sum,rec;
}a[MAXN<<2];
int n,m;
ll t[MAXN];
int cnt=0,l,r,v;
void update(int k){a[k].sum=a[k<<1].sum+a[k<<1|1].sum,a[k].rec=max(a[k<<1].rec,a[k<<1|1].rec);}
void build(int k,int l,int r)
{
a[k].l=l,a[k].r=r;
if(l==r){a[k].sum=a[k].rec=t[l];return;}
int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
update(k);
return;
}
void turn(int k,int l,int r)
{
if(a[k].l==a[k].r){a[k].sum=a[k].rec=sqrt(a[k].sum);return;}
int mid=(a[k].l+a[k].r)>>1;
if(a[k<<1].rec)
if(r<=mid) turn(k<<1,l,r);
else if(l<=mid) turn(k<<1,l,mid);
if(a[k<<1|1].rec)
if(l>mid) turn(k<<1|1,l,r);
else if(r>mid) turn(k<<1|1,mid+1,r);
update(k);
}
ll query(int k,int l,int r)
{
if(a[k].l==l&&a[k].r==r) return a[k].sum;
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) return query(k<<1,l,r);
else if(l>mid) return query(k<<1|1,l,r);
else return query(k<<1,l,mid)+query(k<<1|1,mid+1,r);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) scanf("%lld",&t[i]);
build(1,1,n);
read(m);
printf("Case #%d:",++cnt);
for(int i=1;i<=m;i++)
{
read(v),read(l),read(r);
if(l>r) swap(l,r);
if(!v) turn(1,l,r);else printf("%lld\n",query(1,l,r));
}
puts("");
}
return 0;
}