1.hdu 1166 单点更新,维护区间和

/* ***********************************************
Author        :pk28
Created Time  :2015/9/15 19:38:46
File Name     :4.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 500000+5
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
//线段树 的单点更新和维护区间最大值
struct node{
    int l,r,sum;//维护区间的和
}nod[maxn*4];
int a[maxn];

bool cmp(int a,int b){
    return a>b;
}
int t,n,j;
void push_up(int i){
    nod[i].sum=nod[i<<1].sum+nod[(i<<1)|1].sum;
    //更新到父节点
}
void build(int i,int l,int r){
    nod[i].l=l;
    nod[i].r=r;
//    nod[i].sum=0;
    if(l==r){
        nod[i].sum=a[j++];
        //cout<<a[j-1]<<endl;
        return ;
    }
    int mid=(l+r)/2;
    build(i<<1,l,mid);
    build((i<<1)|1,mid+1,r);
    push_up(i);
}
void update(int i,int k,int w){
    if(nod[i].l==k&&nod[i].r==k){
        nod[i].sum+=w;
        return ;
    }
    int mid=(nod[i].l+nod[i].r)/2;
    if(k<=mid)update(i<<1,k,w);
    else update((i<<1)|1,k,w);
    push_up(i);
}
int quary(int i,int l,int r){
    if(nod[i].l==l&&nod[i].r==r){
        return nod[i].sum;
    }
    int mid=(nod[i].l+nod[i].r)/2;

    if(r<=mid) return quary(i<<1,l,r);
    else if(l>mid)return quary((i<<1)|1,l,r);
    else return quary(i<<1,l,mid)+quary((i<<1)|1,mid+1,r);
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    //freopen("out.txt","w",stdout);
    cin>>t;
    int cnt=0;
    while(t--){
        printf("Case %d:\n",++cnt);
        cin>>n;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        j=1;
        build(1,1,n);
        char s[100];
        while(cin>>s){
            if(s[0]=='E')break;
            else{
                int x,y;
                scanf("%d %d",&x,&y);
                if(s[0]=='A'){
                    update(1,x,y);
                }
                else if(s[0]=='S'){
                    update(1,x,-y);
                }
                else{
                    printf("%d\n",quary(1,x,y));
                }
            }
        }
    }
    return 0;
}
View Code

相关文章: