Cod sursa(job #245305)

Utilizator raula_sanChis Raoul raula_san Data 17 ianuarie 2009 17:10:14
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
using namespace std;

#define MAX_N (1 << 15)

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

int Query(int n, int a, int b, int st, int dr)
{
	if(a >= st && b <= dr)
		return T[n];
	else if(a != b)
	{
		int m = (a + b) >> 1;
		
		int t1, t2;
		if(m > a)
			t1 = Query(n<<1, a, m, st, dr);
		if(m + 1 < b)
			t2 = Query((n<<1)+1, m+1, b, st, dr);
		return t1 + t2;
	}
	else if(a == b)
		return T[n];
}

void Update(int n, int a, int b, int x, int v)
{
	T[n] -= v;
	
	if(a != b)
	{
		int m = (a + b) >> 1;
		
		if(a < m && x >= a && x <= m)
			Update(n<<1, a, m, x, v);
		else if(m + 1 < b)
			Update((n<<1)+1, m+1, b, x, 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 %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
			printf("%d\n", Query(1, 1, N, a, b));
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}