NYOJ 116 士兵杀敌(二) 树状数组 插点问线

重新写一发, 之前写的太乱了,当求数组某个连续区间的和并不时增加或减小单个数组的值时,利用树状数组可以快速实现,有原本的O(N)->O(log N),大大的节省了时间,
NYOJ 116 士兵杀敌(二) 树状数组 插点问线_第1张图片
士兵杀敌(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:5
描述
南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。

小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。

南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。

输入
只有一组测试数据
第一行是两个整数N,M,其中N表示士兵的个数(1

#include<stdio.h>
int a[1000000],n,m;
int lowbit(int x)
{
    return x&(-x);
}
void adds(int i,int x)
{
    while(i<=n)
    {
        a[i]+=x;
        i+=lowbit(i);
    }
}
int shuchu(int i)
{
    int sum=0;
    while(i)
    {
        sum+=a[i];
        i=i-lowbit(i);
    }
    return sum;
}
int main()
{
    int i,j,g;
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&g);
        adds(i,g);
    }
    while(m--)
    {
        char s[10];
        scanf("%s%d%d",&s,&i,&j);
        if(s[0]=='A')
            adds(i,j);
        else
            printf("%d\n",shuchu(j)-shuchu(i-1));
    }
}

你可能感兴趣的:(树状数组,nyoj日常小练)