LightOJ 1112 - Curious Robin Hood 树状数组

题目链接


题意:
给定一个序列,有三个操作

  • 1 i 输出第i个数的大小,并将其变为0
  • 2 i v 第i个数增加v
  • 3 i j 输出第i个数到第j个数的和

树状数组模板题

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <string>
#include <math.h>
#include <bitset>
#include <ctype.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-9;
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
int t, kase = 0;
int c[N];
int n,q,type,x,y;
inline int lowbit(int i)
{
    return i&(-i);
}
void add(int x, int val)
{
    while(x <= n)
    {
        c[x] += val;
        x += lowbit(x);
    }
}
int sum(int x)
{
    int res = 0;
    while(x)
    {
        res += c[x];
        x -= lowbit(x);
    }
    return res;
}

int main()
{
    scanf("%d", &t);
    while(t--)
    {
        printf("Case %d:\n", ++kase);
        scanf("%d%d", &n, &q);
        memset(c, 0, sizeof(c));
        for(int i = 1; i <= n; i++)
        {
            scanf("%d", &x);
            add(i, x);
        }
        while(q--)
        {
            scanf("%d", &type);
            if(type == 1)
            {
                scanf("%d", &x);
                x++;
                int ans = sum(x) - sum(x-1);
                add(x, -ans);
                printf("%d\n", ans);
            }
            else if(type == 2)
            {
                scanf("%d%d", &x,&y);
                x++;
                add(x, y);
            }
            else
            {
                scanf("%d%d", &x, &y);
                x++;y++;
                int ans = sum(y) - sum(x-1);
                printf("%d\n", ans);
            }
        }
    }
    return 0;
}
posted @ 2017-09-03 21:04  可达龙  阅读(178)  评论(0编辑  收藏  举报