时间限制:1秒 内存限制:128M
题目描述
给定数组𝑎1,𝑎2...𝑎𝑛a1,a2...an,进行q次操作,操作有两种:
1 i x
:将𝑎𝑖ai加上 x;
2 l r
:求𝑎𝑙+...+𝑎𝑟al+...+ar
输入描述
第一行:输入两个数 n,q,表示给定数组的长度和操作数
第二行:输入n个数,表示长度为n的给定数组
接下来q行:每行输入3个数字,表示如题的某一种操作
输出描述
对于每个2操作,输出对应结果
输入样例
3 2
1 2 3
1 2 1
2 1 3
输出样例
7
数据描述
1≤𝑛,𝑞≤1061≤n,q≤106
∣𝑎𝑖∣≤106∣ai∣≤106
对于输入:保证1≤𝑙≤𝑟≤𝑛,∣𝑥∣≤1061≤l≤r≤n,∣x∣≤106
代码实现
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e6+10;
int n,q,a[N],op,i,x,l,r;
long long c[N];
int lowbit(int x){
return x & (-x);
}
void add(int x,int y){
for(int i=x;i<=n;i+=lowbit(i)){
c[i]+=y;
}
}
long long getsum(int x){
long long sum=0;
for(int i=x;i;i-=lowbit(i)){
sum+=c[i];
}
return sum;
}
int main(){
scanf("%d %d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
add(i,a[i]);
}
while(q--){
scanf("%d",&op);
if(op==1){
scanf("%d %d",&i,&x);
add(i,x);
}
else{
scanf("%d %d",&l,&r);
printf("%lld\n",getsum(r)-getsum(l-1));
}
}
return 0;
}