Cod sursa(job #633889)

Utilizator eukristianCristian L. eukristian Data 15 noiembrie 2011 00:13:25
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>

#define NMAX 60066

int N, M, arb[NMAX], sum;

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);
void 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)
		{
			sum = 0;
			query(1, 1, N, tmp, val);
			printf("%d\n", sum);
		}
		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;
}

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

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

}