Cod sursa(job #131158)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 3 februarie 2008 12:22:05
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <math.h>

long n, m, choice, num1, num2, arb[60010], i, a[15010];

void add(long val, long poz, long nod, long stanga, long dreapta) {
	if (poz > dreapta || poz < stanga) {
		return;
	}
	arb[nod] += val;
	if (stanga != dreapta) {
		add(val, poz, nod * 2, stanga, (stanga + dreapta) / 2);
		add(val, poz, nod * 2 + 1, (stanga + dreapta) / 2 +1, dreapta);
	}
}

long suma(long left, long right, long nod, long stanga, long dreapta) {
	if (right < stanga || left > dreapta) {
		return 0;
	}
	if (stanga >= left && dreapta <= right) {
		return arb[nod];
	}
	return suma(left, right, nod * 2, stanga, (stanga + dreapta) / 2) + 
		   suma(left, right, nod * 2 + 1, (stanga + dreapta) / 2 + 1, dreapta);
}

int main() {
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	scanf("%ld%ld", &n, &m);
	for (i = 1; i <= n; ++i) {
		scanf("%ld", &a[i]);
		add(a[i], i, 1, 1, n);
	}
	for (i = 1; i <= m; ++i) {
		scanf("%ld%ld%ld", &choice, &num1, &num2);
		if (choice == 0) {
			add(-num2, num1, 1, 1, n);
		} else {
			printf("%ld\n", suma(num1, num2, 1, 1, n));
		}
	}
	return 0;
}