Cod sursa(job #245308)

Utilizator raula_sanChis Raoul raula_san Data 17 ianuarie 2009 17:32:56
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
using namespace std;

#define MAX_N (1 << 15)

int T[MAX_N];
int S, N, M, Op;

void Query(int n, int a, int b, int st, int dr)
{
	if(a >= st && b <= dr)
	{
#ifdef DEBUG
		printf("%d %d -> %d\n", a, b, T[n]);
#endif
		S += T[n];
	}
	else
	{
		int m = (a + b) >> 1;
		if(st <= m) Query(n<<1, a, m, st, dr);
		if(dr > m) Query((n<<1)+1, m+1, b, st, dr);
	}
}

void Update(int n, int a, int b, int x, int v)
{
	if(a < b)
	{
		int m = (a + b) >> 1;
		if(x <= m) Update(n<<1, a, m, x, v);
		else Update((n<<1)+1, m+1, b, x, v);
		T[n] = T[n<<1] + T[(n<<1)+1];
	}
	else
		T[n] -= v;
}

int main()
{
	freopen("datorii.in", "rt", stdin);
	freopen("datorii.out", "wt", stdout);

	int i, a, b;
	for ( scanf("%d %d", &N, &M), i = 1; i <= N; ++i )
	{
		scanf("%d", &Op);
		Update(1, 1, N, i, -Op);
	}

	for ( i = 1; i <= M; ++i )
	{
		scanf("%d %d %d", &Op, &a, &b);
		if(Op == 0) // achit b din valoarea zilei a
			Update(1, 1, N, a, b);
		else // interogare: a, a+1, ..., b-1, b
		{
			S = 0;
#ifdef DEBUG
			printf("%d %d:\n", a, b);
#endif
			Query(1, 1, N, a, b);
			printf("%d\n", S);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}