题目描述
给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区间的和。时间限制1秒。
输入格式
第一行1个数,表示序列的长度n
第二行1个数,表示操作的次数w
后面依次是w行,分别表示加入和询问操作
其中,加入用x表示,询问用y表示
x的格式为"x a b" 表示在序列a的位置加上b
y的格式为"y a b" 表示询问a到b区间的加和
输出格式
每行一个数,分别是每次询问的结果
输入输出样例
输入 #1 复制
5
4
x 3 8
y 1 3
x 4 9
y 3 4
输出 #1 复制
8
17
#include<iostream>
using namespace std;
const int MAXN=100000+2;
int a[MAXN];
int n,w;
int lowbit(int x){
return x&(-x);
}
void add(int p,int x){
while(p<=n){
a[p]+=x;
p+=lowbit(p);
}
}
int ask(int p){
int ans=0;
while(p>0){
ans+=a[p];
p-=lowbit(p);
}
return ans;
}
int main(){
cin>>n>>w;
for(int i=1;i<=w;i++){
char q;
int y,z;
cin>>q>>y>>z;
if(q=='x') add(y,z);
else cout<<ask(z)-ask(y-1)<<endl;
}
return 0;