/*
分析:
线段树。一开始没有想出来,不过仔细想想也就是了,一个
2^64的数,最多开7次平方,取整的话,就成1了,so。。。
2012-10-13
*/
#include"stdio.h" #include"string.h" #include"stdlib.h" #include"math.h" struct seg { int l,r,mid; int flag_1; __int64 sum; }T[300011]; __int64 num[100011]; void build(int l,int r,int k) { T[k].l=l; T[k].r=r; T[k].mid=(l+r)>>1; T[k].flag_1=0; if(l==r) { T[k].sum=num[l]; if(num[l]<=1) T[k].flag_1=1; return ; } build(l,T[k].mid,2*k); build(T[k].mid+1,r,2*k+1); T[k].sum=T[2*k].sum+T[2*k+1].sum; if(T[2*k].flag_1 && T[2*k+1].flag_1) T[k].flag_1=1; } void update(int l,int r,int k) { if(T[k].flag_1) return ; if(T[k].l==l && T[k].r==r && l==r) { T[k].sum=(__int64)sqrt(1.0*T[k].sum); if(T[k].sum<=1) T[k].flag_1=1; return ; } if(r<=T[k].mid) update(l,r,2*k); else if(l>T[k].mid) update(l,r,2*k+1); else { update(l,T[k].mid,2*k); update(T[k].mid+1,r,2*k+1); } T[k].sum=T[2*k].sum+T[2*k+1].sum; if(T[2*k].flag_1 && T[2*k+1].flag_1) T[k].flag_1=1; } __int64 find(int l,int r,int k) { __int64 ans=0; if(T[k].l==l && T[k].r==r) return T[k].sum; if(r<=T[k].mid) ans+=find(l,r,2*k); else if(l>T[k].mid) ans+=find(l,r,2*k+1); else { ans+=find(l,T[k].mid,2*k); ans+=find(T[k].mid+1,r,2*k+1); } return ans; } int main() { int Case=1; int n,m; int i; int a,b,c,x,y; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) scanf("%I64d",&num[i]); build(1,n,1); scanf("%d",&m); printf("Case #%d:\n",Case++); while(m--) { scanf("%d%d%d",&c,&a,&b); x=a>b?b:a; y=a>b?a:b; if(c) printf("%I64d\n",find(x,y,1)); else update(x,y,1); } printf("\n"); } return 0; }