标签:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 6 using namespace std; 7 8 #define lson l,m,rt<<1 9 #define rson m+1,r,rt<<1|1 10 #define LL long long 11 const int maxn=100000+5; 12 13 LL sum[maxn<<2]; 14 15 //因为2^63总和最多2^63 16 //如果只有1个数,也就最多开7次根号 17 //即开着开着就恒为1 18 //所以,当该区间的和等于区间长度(r-l)+1的时候, 19 //该区间的值都不会再更新 20 21 //1表示这个区间不需要更新了 22 23 void pushup(int rt) 24 { 25 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 26 27 } 28 29 void build(int l,int r,int rt) 30 { 31 if(l==r) 32 { 33 scanf("%lld",&sum[rt]); 34 return ; 35 } 36 37 int m=(l+r)>>1; 38 39 build(lson); 40 build(rson); 41 pushup(rt); 42 } 43 44 void update(int L,int R,int l,int r,int rt) 45 { 46 if(sum[rt]==r-l+1) 47 return ; 48 49 if(l==r) 50 { 51 sum[rt]=(LL)(sqrt((long double)sum[rt])); 52 //printf("%lld ",sum[rt]); 53 return ; 54 } 55 56 int m=(l+r)>>1; 57 58 if(L<=m) 59 update(L,R,lson); 60 if(R>m) 61 update(L,R,rson); 62 63 pushup(rt); 64 } 65 66 LL query(int L,int R,int l,int r,int rt) 67 { 68 if(L<=l&&R>=r) 69 { 70 return sum[rt]; 71 } 72 73 int m=(l+r)>>1; 74 75 LL ret=0; 76 77 if(L<=m) 78 ret+=query(L,R,lson); 79 if(R>m) 80 ret+=query(L,R,rson); 81 82 return ret; 83 } 84 85 int main() 86 { 87 int cas=1; 88 89 int n; 90 91 while(scanf("%d",&n)!=EOF) 92 { 93 //memset(cal,0,sizeof(cal)); 94 95 build(1,n,1); 96 97 int m; 98 scanf("%d",&m); 99 100 int T,x,y; 101 102 printf("Case #%d:\n",cas++); 103 104 for(int i=1;i<=m;i++) 105 { 106 scanf("%d %d %d",&T,&x,&y); 107 108 if(x>y) 109 swap(x,y); 110 111 if(T==0) 112 { 113 update(x,y,1,n,1); 114 } 115 else 116 { 117 printf("%lld\n",query(x,y,1,n,1)); 118 } 119 } 120 121 printf("\n"); 122 } 123 return 0; 124 }
HDU 4027 Can you answer these queries? 线段树,区间修改
标签:
原文地址:http://www.cnblogs.com/-maybe/p/4479090.html