uva 12086 - Potentiometers

线段树or树状数组均可以做此题,不过树状数组的代码量要小:
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <vector>
#include <cstring>
#include <algorithm>

#define INF 0x3fffffff
#define inf -0x3f3f3f3f
#define N 200010
#define M 4000010
#define LL long long
#define mod 20071027

using namespace std;

int n;
int d[N], arr[N];

int lowbit(int x){
    return x & (-x);
}

void add(int x, int val){
    while(x <= n){
        d[x] += val;
        x += lowbit(x);
    }
}

int sum(int x){
    int s = 0;
    while(x > 0){
        s += d[x];
        x -= lowbit(x);
    }
    return s;
}

int main() {
   // freopen("in.txt", "r", stdin);
    int t = 0;
    while(scanf("%d", &n) != EOF){
        if(! n) break;
        memset(d, 0, sizeof(d));
        for(int i = 1; i <= n; ++ i){
            scanf("%d", &arr[i]);
            add(i, arr[i]);
        }
        if(t) puts("");
        printf("Case %d:\n", t + 1);
        char str[5];
        while(scanf("%s", str) != EOF){
            if(str[0] == 'E') break;
            int l, r;
            scanf("%d %d", &l, &r);
            if(str[0] == 'S'){
                add(l, r - arr[l]);
                arr[l] = r;
                continue;
            }
            printf("%d\n", sum(r) - sum(l - 1));
        }
        ++ t;
       // printf("  %d\n", d[2]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/moyan_min/article/details/17200339