Cod sursa(job #633883)

Utilizator eukristianCristian L. eukristian Data 14 noiembrie 2011 23:52:43
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>

#define NMAX 45000

int N, M, arb[NMAX];

void update(int node, int left, int right, const int &pos, const int &val);
//void init(int node, int left, int right, const int &pos, const int &val);
int query(int node, int left, int right, const int &A, const int &B);

int main()
{
	int tmp, type, val;
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out","w",stdout);

	scanf("%d %d", &N, &M);
	for (int i = 1 ;i <= N ; ++i)
	{
		scanf("%d", &tmp);
		tmp = -tmp;
		update(1, 1, N, i, tmp);
	}

	for (;M;--M)
	{
		scanf("%d %d %d", &type, &tmp, &val);
		if (type)
			printf("%d\n", query(1, 1, N, tmp, val));
		else
			update(1, 1, N, tmp, val);
	}

	return 0;
}

void update(int node, int left, int right, const int &pos, const int &val)
{
	if (left >= right)
	{
		arb[node] -= val;
		return;
	}

	int mid = (left + right) >> 1;
	if (pos <= mid) update(node << 1, left, mid, pos, val);
	else update((node << 1) + 1, mid + 1, right, pos, val);
	arb[node] -= val;
}

int query(int node, int left, int right, const int &A, const int &B)
{
	if (left >= A && right <= B)
		return arb[node];

	int mid = (left + right) >> 1, p1 = 0, p2 = 0;
	if (A <= mid) p1 = query(node << 1, left, mid, A, B);
	if (B > mid) p2 = query((node << 1) + 1, mid + 1, right, A, B);

	return p1 + p2;
}