HDU4027-Can you answer these queries?
http://acm.hdu.edu.cn/showproblem.php?pid=4027
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 100001 using namespace std; __int64 sum[maxn<<2]; int cnt[maxn<<2]; bool limit[maxn<<2]; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; limit[rt]=limit[rt<<1]&limit[rt<<1|1]; } void build(int l,int r,int rt) { if(l==r) { scanf("%I64d",&sum[rt]); limit[rt]=false; cnt[rt]=0; return; } int m=l+r>>1; build(lson); build(rson); pushup(rt); } void update(int L,int R,int l,int r,int rt) { if(limit[rt]) return; if(L<=l&&R>=r) { if(l==r) { sum[rt]=(__int64)sqrt(double(sum[rt])); cnt[rt]++; if(cnt[rt]==8) limit[rt]=true; return; } } int m=l+r>>1; if(L<=m) update(L,R,lson); if(R>m) update(L,R,rson); pushup(rt); } __int64 query(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) return sum[rt]; int m=l+r>>1; __int64 ret=0; if(L<=m) ret+=query(L,R,lson); if(R>m) ret+=query(L,R,rson); return ret; } int main(void) { int n,m,flag,a,b,c,cas=1; while(scanf("%d",&n)!=EOF) { build(1,n,1); scanf("%d",&m); printf("Case #%d:\n",cas++); while(m--) { scanf("%d%d%d",&flag,&a,&b); if(a>b) swap(a,b); if(flag==0) update(a,b,1,n,1); else printf("%I64d\n",query(a,b,1,n,1)); } puts(""); } return 0; }