标签:
Description
Input
Output
Sample Input
Sample Output
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define mid (L+R)/2 #define lson rt*2,L,mid #define rson rt*2+1,mid+1,R #define LL long long const int maxn=101000; LL sumv[maxn*4]; int num[maxn*4]; void PushUP(int rt){ sumv[rt]=sumv[rt*2]+sumv[rt*2+1]; num[rt]=num[rt*2]+num[rt*2+1]; } void build(int rt,int L,int R){ if(L==R){ scanf("%lld",&sumv[rt]); if(sumv[rt]==0||sumv[rt]==1){ num[rt]=0; }else{ num[rt]=1; } return ; } build(lson); build(rson); PushUP(rt); } void _sqrt(int rt,int L,int R){ if(L==R){ sumv[rt]=(LL)sqrt(sumv[rt]); if(sumv[rt]==0||sumv[rt]==1){ num[rt]=0; }else{ num[rt]=1; } return ; } _sqrt(lson); _sqrt(rson); PushUP(rt); } void update(int rt,int L,int R,int l_ran,int r_ran){ if(l_ran<=L&&R<=r_ran){ if(num[rt]!=0){ _sqrt(rt,L,R); } return ; } if(l_ran<=mid){ update(lson,l_ran,r_ran); } if(r_ran>mid){ update(rson,l_ran,r_ran); } PushUP(rt); } LL query(int rt,int L,int R,int l_ran,int r_ran){ if(l_ran<=L&&R<=r_ran){ return sumv[rt]; } LL ret=0; if(l_ran<=mid){ ret+=query(lson,l_ran,r_ran); } if(r_ran>mid){ ret+=query(rson,l_ran,r_ran); } return ret; } int main(){ int n,m,cnt=0; while(scanf("%d",&n)!=EOF){ build(1,1,n); printf("Case #%d:\n",++cnt); scanf("%d",&m); for(int i=0;i<m;i++){ int f,tml,tmr; scanf("%d%d%d",&f,&tml,&tmr); if(tml>tmr){ int k=tml; tml=tmr; tmr=k; } if(!f){ update(1,1,n,tml,tmr); }else{ printf("%lld\n",query(1,1,n,tml,tmr)); } } printf("\n"); } return 0; }
HDU 4027—— Can you answer these queries?——————【线段树区间开方,区间求和】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4418324.html