Light oj 1112 - Curious Robin Hood(树状数组)

简介: 有n个数,有m组操作,1 i表示将第i个数先输出,然后置0, 2 i v 表示给第i个数加上v, 3 i j 表示求i 到 j 的和,注意,这里数组是从0开始的,而我们构造的树状数组是从1开始的,使用在程序中要进行一定的处理。

题意:

  有n个数,有m组操作,1 i表示将第i个数先输出,然后置0, 2 i v 表示给第i个数加上v, 3 i j 表示求i 到 j 的和,注意,这里数组是从0开始的,而我们构造的树状数组是从1

开始的,使用在程序中要进行一定的处理。

//LA 1112 - Curious Robin Hood(树状数组)
//2013-04-13-08.22
#include <stdio.h>
#include <string.h>
const int maxn = 100010;
int a[maxn], b[maxn];
int n;
int lowbit(int x)
{
    return x&(-x);
}
void update(int x, int v)
{
    while (x <= n)
    {
        a[x] += v;
        x += lowbit(x);
    }
}
int getsum(int x)
{
    int sum = 0;
    while (x)
    {
        sum += a[x];
        x -= lowbit(x);
    }
    return sum;
}
int main()
{
    int t, m;
    scanf("%d",&t);
    for (int k = 1; k <= t; k++)
    {
        scanf("%d %d",&n, &m);
        memset(a, 0 ,sizeof(a));
        for (int i = 1; i <= n; i++)
        {
            scanf("%d",&b[i]);
            update(i, b[i]);
        }
        int op, i, v, j;
        printf("Case %d:\n",k);
        while (m--)
        {
            scanf("%d",&op);
            if (op == 1)
            {
                scanf("%d",&i);
                printf("%d\n",b[i+1]);
                update(i+1, -b[i+1]);
                b[i+1] = 0;
            }
            else if (op == 2)
            {
                scanf("%d %d",&i, &v);
                update(i+1, v);
                b[i+1] += v;
            }
            else
            {
                scanf("%d %d",&i,&j);
                printf("%d\n",getsum(j+1) - getsum(i));
            }
        }
    }
    return 0;
}


目录
相关文章
|
7月前
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
|
5月前
|
机器学习/深度学习
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
19 0
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
|
7月前
|
机器学习/深度学习 存储
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
26 0
|
7月前
|
机器学习/深度学习
light oj 1005 - Rooks(组合数学)
组合数学解法 现在n行中选出m行,C(n,m),再在n列中选出m列随便放A(n,m),答案为C(n,m)*A(n,m)。
20 0
|
7月前
light oj 1159 - Batman LCS
学过简单动态规划的人应该对最长公共子序列的问题很熟悉了,这道题只不过多加了一条字符串变成三条了,还记得,只要把状态变成三维的即可。
16 0
|
7月前
|
算法
light oj 1047 - Neighbor House 动态规划
动态规划,这个和刘汝佳算法竞赛入门经典P158的数字三角形有些相似,不过是求最小的值,而且有些限制,每次走到点和上次走的点不在同一列。
17 0
|
7月前
|
人工智能
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
所谓离散化,我们的了解就是对原数组排序,然后用所在位置的下标代替原数,这样我们就可以把数据范围缩小到1-500000,这个数组是开的下的。
22 0
|
人机交互
POJ-2524,Ubiquitous Religions(并查集模板题)
POJ-2524,Ubiquitous Religions(并查集模板题)
HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
90 0