标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)
Total Submission(s): 11333 Accepted Submission(s): 2650
#include"cstdio" #include"cmath" #include"algorithm" using namespace std; const int MAXN=100005; typedef long long LL; struct node{ int l,r; LL sum; }a[MAXN*4]; void build(int rt,int l,int r) { a[rt].l=l; a[rt].r=r; if(l==r) { scanf("%lld",&a[rt].sum); return ; } int mid=(l+r)>>1; build(rt<<1,l,mid); build((rt<<1)|1,mid+1,r); a[rt].sum=a[rt<<1].sum+a[(rt<<1)|1].sum; } void update(int rt,int l,int r) { if(a[rt].sum==(a[rt].r-a[rt].l+1)) return ;//优化,各个叶子节点的值为1后不用再更新 if(a[rt].l==a[rt].r) { a[rt].sum=(LL)sqrt(a[rt].sum*1.0); return ; } int mid=(a[rt].l+a[rt].r)>>1; if(r<=mid) update(rt<<1,l,r); else if(mid<l) update((rt<<1)|1,l,r); else{ update(rt<<1,l,mid); update((rt<<1)|1,mid+1,r); } a[rt].sum=a[rt<<1].sum+a[(rt<<1)|1].sum; } LL query(int rt,int l,int r) { if(a[rt].l==l&&a[rt].r==r) { return a[rt].sum; } int mid=(a[rt].l+a[rt].r)>>1; if(r<=mid) return query(rt<<1,l,r); else if(mid<l) return query((rt<<1)|1,l,r); else{ return query(rt<<1,l,mid)+query((rt<<1)|1,mid+1,r); } } int main() { int cas=1; int n; while(scanf("%d",&n)!=EOF) { build(1,1,n); printf("Case #%d:\n",cas++); int m; scanf("%d",&m); while(m--) { int t,x,y; scanf("%d%d%d",&t,&x,&y);//x有可能比y大 if(x>y) swap(x,y); if(t==0) { update(1,x,y); } else { printf("%lld\n",query(1,x,y)); } } printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5127867.html