传送门:洛谷 P2068
题目描述
给定一个长度为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区间的加和
输出格式:每行一个数,分别是每次询问的结果
输入输出样例
这么直接的树状数组怕是不多见。。。标准的模板!!!
代码如下
#include<iostream>
using namespace std;
int a[200005],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 sum(int x)
{
int ans = 0;
while(x)
{
ans += a[x];
x -= lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>w;
for(int i=1;i<=w;i++)
{
char ch;
int y,z;
cin>>ch>>y>>z;
if(ch == 'x') add(y,z);
else cout<<sum(z) - sum(y-1)<<endl;
}
return 0;
}