1. 程式人生 > >hdu 1166敵兵佈陣(線段樹 模板 單點更新加區間查詢)

hdu 1166敵兵佈陣(線段樹 模板 單點更新加區間查詢)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 50005
#define lson i*2,l,m
#define rson i*2+1,m+1,r


int sum[maxn*4];
void pushup(int i)
{
    sum[i]=sum[i*2]+sum[i*2+1];
}
void build(int i ,int l,int r)
{if(l==r)
{
    scanf("%d",&sum[i]);
    return ;
}
  int m=(l+r)/2;
  build(lson);
  build(rson);
  pushup(i);
}
int query(int ql,int qr,int i,int l,int r)
{
    if(ql<=l&&r<=qr)
    return sum[i];
    int m=(l+r)/2;
    int res=0;
    if(ql<=m)
    res+=query(ql,qr,lson);
    if(m<qr)
    res+=query(ql,qr,rson);
    return res;

}
void update(int id,int val,int i,int l,int r)
{
    if(l==r)
    {
        sum[i]+=val;
        return ;
    }
    int m=(l+r)/2;
    if(id<=m)
    update(id,val,lson);
    else
    update(id,val,rson);
    pushup(i);
}
int main()
{
    int t;
    scanf("%d",&t);
    int w=0;
    while(t--)
    {
        w++;

        printf("Case %d:\n",w);
        int n;
        scanf("%d",&n);
        build(1,1,n);
        char str[20];
        int u,v;
        while(~scanf("%s",str)&&str[0]!='E')
        {
            scanf("%d%d",&u,&v);
            if(str[0]=='Q')
            printf("%d\n",query(u,v,1,1,n));
            else if(str[0]=='A')
            update(u,v,1,1,n);
            else update(u,-v,1,1,n);
        }

    }
    return 0;
}