HDU-1166:敌兵布阵

线段树里面的单点跟新,第一次写线段树觉得这真是个
#include 
#include 
#include 
#include 
using namespace std;

#define maxn 50005
int v[maxn*2];

struct tr
{
    int R,L,S;
}tree[maxn*3];

void build(int nood,int l,int r)
{
    tree[nood].L=l;
    tree[nood].R=r;
    if(l==r) {tree[nood].S=v[l];return;}
    build(nood*2,l,(l+r)/2);
    build(nood*2+1,(l+r)/2+1,r);
    tree[nood].S=tree[nood*2].S+tree[nood*2+1].S;
}

void Insert(int nood,int i,int k)
{
    tree[nood].S+=k;
    if(tree[nood].L==i&&tree[nood].R==i) return;
    else if((tree[nood].L+tree[nood].R)/2=r) return sum(nood*2,l,r);
    else return sum(nood*2,l,(tree[nood].L+tree[nood].R)/2)+sum(nood*2+1,(tree[nood].L+tree[nood].R)/2+1,r);
}

int main()
{
    int t,n,i,j,q;
    char str[10];
    scanf("%d",&t);
    for(q=1;q<=t;q++)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%d",&v[i]);
        build(1,1,n);
        printf("Case %d:\n",q);
        while(~scanf("%s",str))
        {
            if(str[0]=='E') break;
            scanf("%d%d",&i,&j);
            if(str[0]=='A') Insert(1,i,j);
            else if(str[0]=='S') Insert(1,i,-j);
            else
            {
                int ss=sum(1,i,j);
                printf("%d\n",ss);
            }
        }
    }
    return 0;
}

神奇的结构

你可能感兴趣的:(线段树)