UVa 12086 - Potentiometers

来源:互联网 发布:伊丽莎白航母数据 编辑:程序博客网 时间:2024/05/17 07:54

題目:已知一個序列,有兩種操作S x y:將第x各元素替換成y,M x y:求第x倒第y各元素的和。

分析:數據結構,樹狀數組。區間操作直接用樹狀數組或線段樹。

說明:╮(╯▽╰)╭。

#include <cstring>#include <cstdio>int data[200002];int C[200002];int lb(int x) {return x&-x;}int sum(int k) {int value = C[k];while (k > lb(k)) value += C[(k-=lb(k))];return value;}void add(int k, int d, int n) {C[k] += d;while (k+lb(k) <= n) C[(k+=lb(k))] += d;}int main(){int  cases = 0, n, x, y;char buf[10];while (~scanf("%d",&n) && n) {memset(C, 0, sizeof(C));for (int i = 1; i <= n; ++ i) {scanf("%d",&data[i]);add(i, data[i], n);}if (cases ++) puts("");printf("Case %d:\n",cases);while (~scanf("%s",buf) && buf[0] != 'E') {scanf("%d%d",&x,&y);if (buf[0] == 'S') {add(x, y-data[x], n);data[x] = y;}else printf("%d\n",sum(y)-sum(x-1));}}    return 0;}


0 0