题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m分别表示该数列数字的个数和操作的总个数。 第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。 接下来 m 行每行包含 3 个整数,表示一个操作,具体如下: 1 x k 含义:将第 x个数加上 k 2 x y 含义:输出区间 [x,y]内每个数的和 输出格式 输出包含若干行整数,即为所有操作的结果。 输入输出样例 输入 5 5 1 5 4 2 3 1 1 3 2 2 5 1 3 -1 1 4 2 2 1 4 输出 14 16 题解代码如下
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int tr[N];
int n,m;
int lowbit(int x){
return x & -x;
}
void add(int x,int c){
for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c;
}
int sum(int x){
int res = 0;
for(int i=x;i;i-=lowbit(i)) res+=tr[i];
return res;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
add(i,x);
}
while(m --){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a == 1) add(b,c);
if(a == 2){
long long ans = sum(c) - sum(b - 1);
printf("%lld\n",ans);
}
}
return 0;
}
|