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