HDU 1166 敌兵布阵

HDU 1166 敌兵布阵
单个更新;维护区间和。
以下是我的代码:
#include < iostream >
#include
< string >
#define  maxn 50007
#define  L(x) (x<<1)
#define  R(x) ((x<<1)+1)
using   namespace  std;
const   string  _1( " Add " );
const   string  _2( " Sub " );
const   string  _3( " Query " );
const   string  end( " End " );
struct
{
    
long  a,b,sum;
}seg[maxn
* 3 ];
long  test,n,r[maxn];
void  build( long  node, long  x, long  y)
{
    
long  mid = (x + y) >> 1 ;
    seg[node].a
= x;seg[node].b = y;
    
if (x == y)
      seg[node].sum
= r[x];
    
else   if (x < y)
    {
       build(L(node),x,mid);
       build(R(node),mid
+ 1 ,y);
       seg[node].sum
= seg[L(node)].sum + seg[R(node)].sum;
    }
}
void  add( long  node, long  pos, long  det)
{
    
long  a = seg[node].a,b = seg[node].b,mid = (a + b) >> 1 ;
    seg[node].sum
+= det;
    
if (a < b)
    {
       
if (mid >= pos)
         add(L(node),pos,det);
       
else  add(R(node),pos,det);
    }
}
void  sub( long  node, long  pos, long  det)
{
    
long  a = seg[node].a,b = seg[node].b,mid = (a + b) >> 1 ;
    seg[node].sum
-= det;
    
if (a < b)
    {
       
if (mid >= pos)
         sub(L(node),pos,det);
       
else  sub(R(node),pos,det);
    }
}
long  getsum( long  node, long  x, long  y)
{
    
long  a = seg[node].a,b = seg[node].b,mid = (a + b) >> 1 ,re = 0 ;
    
if (x <= a && b <= y)
      re
= seg[node].sum;
    
else
    {
       
if (mid >= x)
         re
+= getsum(L(node),x,y);
       
if (mid + 1 <= y)
         re
+= getsum(R(node),x,y);
    }
    
return  re;
}
int  main()
{
    
long  a,b;
    
string  cmd;
    cin
>> test;
    
for ( long  k = 1 ;k <= test;k ++ )
    {
       cin
>> n;
       
for ( long  i = 1 ;i <= n;i ++ ) cin >> r[i];
       build(
1 , 1 ,n);
       cout
<< " Case  " << k << " : " << endl;
       
while (cin >> cmd && cmd != end && cin >> a >> b)
         
if (cmd == _1)
           add(
1 ,a,b);
         
else   if (cmd == _2)
           sub(
1 ,a,b);
         
else   if (cmd == _3)
           cout
<< getsum( 1 ,a,b) << endl;
    }
return   0 ;
}


你可能感兴趣的:(HDU 1166 敌兵布阵)