Cod sursa(job #164772)

Utilizator vlad.maneaVlad Manea vlad.manea Data 24 martie 2008 20:05:25
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 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)
	{
		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)
	{
		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;
}