【题目描述】
给定一数列,规定有两种操作,一是修改某个元素,二是求区间的连续和。
【输入】
输入数据第一行包含两个正整数n,m(n≤100000,m≤500000)
,以下是m
行,
每行有三个正整数k,a,b
(k=0或1,a,b≤n).k=0时表示将a处数字加上b,k=1时表示询问区间[a,b
]内所有数的和。
【输出】
对于每个询问输出对应的答案。
【输入样例】
10 20
0 1 10
1 1 4
0 6 6
1 4 10
1 8 9
1 4 9
0 10 2
1 1 8
0 2 10
1 3 9
0 7 8
0 3 10
0 1 1
1 3 8
1 6 9
0 5 5
1 1 8
0 4 2
1 2 8
0 1 1
【输出样例】
10
6
0
6
16
6
24
14
50
41
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100000 + 10;
#define ll long long
ll sum[N * 4];
int n,m;
int op,a,b;
void modify(int u,int l,int r,int p,int v)
{
if(r<p||l>p) return ;
if(l == r && l == p)
{
sum[u] += v;
return ;
}
else
{
int mid = (l + r)/2;
modify(u * 2, l, mid, p, v);
modify(u * 2 + 1, mid + 1, r, p, v);
sum[u] = sum[u * 2] + sum[u * 2 + 1];
}
}
ll query(int u,int l,int r,int x,int y)
{
if(y<l || x>r) return 0;
if(l >= x && r <= y) return sum[u];
int mid = (l + r)/2;
ll res =0;
res = query(u * 2, l, mid, x, y);
res+= query(u * 2 + 1, mid + 1, r, x, y);
return res;
}
int main()
{
scanf("%d %d",&n,&m);
while(m--)
{
scanf("%d %d %d",&op,&a,&b);
if(op == 0)
{
modify(1,1,n,a,b);
}
if(op == 1)
{
printf("%lld\n",query(1,1,n,a,b));
}
}
return 0;
}