hdu-1666敌兵布阵

本来是想快速A点水题,没想到被这题折磨了两个多小时(╯‵□′)╯︵┴─┴
这题题意很简单,就是一串字,让你改变某个位置的数字后,再问你某个区间的元素之和。
解法没啥好讲的,就是线段树的裸题啊啊啊啊啊啊啊啊啊啊啊啊(≧ω≦) 

我居然写顺手了直接把线段树模板上的函数复制到代码里,以至于初始化的函数与此题不符合……

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
const int MAX=1<<19;
int Max;
int father[MAX];
struct d
{
    int left,right;
    int value;
}node[MAX];

void buildtree(int i,int left,int right)
{
    node[i].left=left;
    node[i].right=right;
    node[i].value=0;
    if(left==right)
    {
        father[left]=i;
        return ;
    }
    buildtree(i<<1,left,(left+right)/2);
    buildtree((i<<1)+1,(left+right)/2+1,right);
}

void update(int zi,int v)
{
    if(zi==1)
    {
        node[zi].value+=v;
        return ;
    }
    node[zi].value+=v;
    update(zi/2,v);
}
int sum;
void query(int i,int l,int r)
{
    if(node[i].left==l&&node[i].right==r)
    {
        sum+=node[i].value;
        //printf("%d %d\n",sum,node[i].value);
        return ;
    }
    i=i<<1;
    if(l<=node[i].right)
        if(r<=node[i].right)
            query(i,l,r);
        else
            query(i,l,node[i].right);
    i++;
    if(r>=node[i].left)
        if(l>=node[i].left)
            query(i,l,r);
        else
            query(i,node[i].left,r);

}

int main()
{
    int k=1;
    int zu;
    char c[15];
    int num;
    int v;
    scanf("%d",&zu);
    while(zu--)
    {
        scanf("%d",&num);
        buildtree(1,1,num);
        for(int i=1;i<=num;i++)
        {
            scanf("%d",&v);
            //node[father[i]].value=v;
            update(father[i],v);
        }
        printf("Case %d:\n",k++);
        int a,b;
        while(1)
        {
            scanf("%s",c);
            if(c[0]=='E')
                break;
            cin>>a>>b;
            if(c[0]=='A')
            {
                //node[father[a]].value+=b;
                update(father[a],b);
            }
            else if(c[0]=='S')
            {
                //node[father[a]].value-=b;
                update(father[a],-b);
            }
            else if(c[0]=='Q')
            {
                sum=0;
                query(1,a,b);
                printf("%d\n",sum);
            }
        }
    }
}