单点修改区间查询
题目
输入
输出
对于每个 2 2 2 l l l r r r 操作输出一行,每行有一个整数,表示所求的结果
输入样例
3 2
1 2 3
1 2 0
2 1 3
输出样例
6
解题思路
这题用的是树状数组,树状数组支持单点加操作,还支持查询前缀和,这题我们就直接可以用到
程序如下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n, m, r;
long long c[1000001];
void update(int x, int y)//加法操作
{
for(; x <= n; x += x & -x) c[x] += y;
}
long long query(long long x)//查询操作
{
long long ans = 0;
for(; x; x -= x & -x) ans += c[x];
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i)
{
int val;
scanf("%d",&val);
update(i, val);
}
for(int i = 1; i <= m; ++i)
{
scanf("%d",&r);
if(r == 1)
{
int x, k;
scanf("%d%d",&x,&k);
update(x, k);
}
else if(r == 2)
{
int x, y;
scanf("%d%d",&x,&y);
printf("%lld\n",query(y) - query(x - 1));
}
}
return 0;
}