线段树,下面代码实现区间和的查询和个体元素的修改。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxx = 1e6;
int a[maxx], tree[maxx * 10];
void build_tree(int l, int r, int s)
{
int mid, s1, s2;
mid = (l + r) / 2;
s1 = s * 2 + 1;
s2 = s * 2 + 2;
if(l != r)
{
build_tree(l, mid, s1);
build_tree(mid + 1, r, s2);
tree[s] = tree[s1] + tree[s2];
}
else tree[s] = a[l];
}
int find_tree(int l, int r, int x, int y, int s)
{
int mid, s1, s2;
mid = (x + y) / 2;
s1 = s * 2 + 1;
s2 = s * 2 + 2;
if(l > y || r < x) return 0;
else if(x >= l && y <= r) return tree[s];
else return find_tree(l, r, x, mid, s1) + find_tree(l, r, mid + 1, y, s2);
}
void updata(int x, int y, int l, int r, int s)
{
int mid, s1, s2;
mid = (l + r) / 2;
s1 = s * 2 + 1;
s2 = s * 2 + 2;
if(l != r)
{
if(l <= x && x <= r)
{
updata(x, y, l, mid, s1);
updata(x, y, mid + 1, r, s2);
}
tree[s] = tree[s1] + tree[s2];
}
else tree[s] = y;
}
int main()
{
int i, n, m, l, r, k, sum;
scanf("%d %d", &n, &m);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
build_tree(0, n - 1, 0);
for(i = 0; i < n; i++)
printf("%d ", tree[i]);
printf("\n");
while(m--)
{
scanf("%d %d %d", &k, &l, &r);
if(k == 1)
{
l--; r--;
sum = find_tree(l, r, 0, n - 1, 0);
printf("%d\n", sum);
}
else
{
l--;
a[l] = r;
updata(l, r, 0, n - 1, 0);
}
}
return 0;
}