Cod sursa(job #348398)

Utilizator andrei.12Andrei Parvu andrei.12 Data 15 septembrie 2009 18:35:47
Problema Datorii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include<stdio.h>

int n, m, i, x, tip, t, v, p1, p2, init[15002], q[32790];

void cstr(int st, int dr, int poz){
	if (st == dr){
		init[st] = poz;
		return ;
	}

	int x = (st + dr) / 2;
	cstr(st, x, 2*poz); cstr(x+1, dr, 2*poz+1);
}
void update(int poz, int val){
	for (poz = init[poz]; poz; poz /= 2)
		q[poz] += val;
}
int query(int st, int dr, int poz){
	if (p1 <= st && dr <= p2)
		return q[poz];

	if (st > p2 || dr < p1)
		return 0;

	int x = (st + dr) / 2;

	return query(st, x, 2*poz) + query(x+1, dr, 2*poz+1);
}

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

	scanf("%d%d", &n, &m);

	cstr(1, n, 1);

	for (i = 1; i <= n; i ++){
		scanf("%d", &x);

		update(i, x);
	}

	for (i = 1; i <= m; i ++){
		scanf("%d%d%d", &tip, &t, &v);

		if (!tip)
			update(t, -v);
		else{
			p1 = t, p2 = v;

			printf("%d\n", query(1, n, 1));
		}
	}

	return 0;
}