树状数组 单点更新+区间查询

Input

每组测试用例首先一行是2个正整数N和M(N<=100000,M<=10000),其中,N表示士兵的数量,M表示有M个询问。

接下来一行是N个正整数,依次表示N位士兵CF的Rating。其中,Rating的取值范围是小于等于5000。

最后是M行的询问,每行包含2个正整数a和b,表示要计算从第a个士兵到第b个士兵的Rating之和(1<=a, b<=N)。

Output

每组数据输出M行,分别表示M个询问对应的Rating之和。

Sample Input:

5 2
1500 1921 2134 1462 2403
1 3
2 5

Sample Output:

5555
7920

AC代码

#include <bits/stdc++.h>
using namespace std;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define INF 0x3f3f3f3f
typedef long long ll;

const int maxn = 100005;

int a[maxn],c[maxn],n,m,u,v;

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

int sum(int i){ //1-i的和
    int ret=0;
    while(i>0){
        ret+=c[i];     
        i-=lowbit(i);
    }
    return ret;            
}

void add(int x,int p){ //对x位置增加p
    while(x<=n){
        c[x]+=p;
        x+=lowbit(x);
    }
}

int main(int argc, char **argv){
    while(~scanf("%d%d",&n,&m)){
        fill(c, c+maxn, 0);
        for(int i=1; i<=n; i++){
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++){
            add(i,a[i]);  //构造树状数组
        }
        while(m--){
            scanf("%d%d",&u,&v);
            if(u>v){
                int temp=u;
                u=v;
                v=temp;
            }
            printf("%d\n",sum(v)-sum(u-1));  //输出区间和
        }
    }
    return 0;
}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

征服所有不服

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值