Cod sursa(job #164770)

Utilizator vlad.maneaVlad Manea vlad.manea Data 24 martie 2008 19:58:30
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#define nodes 220000
#define nmax 16000

int N, M;
int V[nodes], A[nmax];

void create(int node, int l, int r)
{
	if (l > r)
		return;

	if (l == r)
	{
		V[node] = A[l];
		return;
	}

	int m = (l+r)>>1;

	create(node<<1, l, m);
	create(node<<1|1, m+1, r);

	V[node] = V[node<<1] + V[node<<1|1];
}

void update(int node, int p, int l, int r, int v)
{
	if (l > r)
		return;

	if (l == r)
	{
		V[node] -= v;
		return;
	}

	int m = (l+r)>>1;

	if (p < m)
		update(node<<1, p, l, m, v);
	else
		update(node<<1|1, p, m+1, r, v);

	V[node] = V[node<<1] + V[node<<1|1];
}

int query(int node, int a, int b, int l, int r)
{
	if (a <= l && r <= b)
	{
		return V[node];
	}

	int m = (l+r)>>1, x = 0;

	if (a <= m)
		x += query(node<<1, a, b, l, m);
	if (b > m)
		x += query(node<<1|1, a, b, m+1, r);

	return x;
}

int main()
{
	int i, t, a, b;

	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);

	scanf("%d%d", &N, &M);

	for (i = 1; i <= N; ++i)
		scanf("%d", &A[i]);

	create(1, 1, N);

	while (M--)
	{
		scanf("%d%d%d", &t, &a, &b);

		if (t == 0)
			update(1, a, 1, N, b);
		else
			printf("%d\n", query(1, a, b, 1, N));
	}

	return 0;
}