Cod sursa(job #153250)

Utilizator plastikDan George Filimon plastik Data 10 martie 2008 12:37:49
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>
#include <cstring>
#define MAXN 15005

int A[MAXN], BIT[MAXN];
int n, m;

void BITAdd(int i, int v) {
	if (i > n)
		return;
	
	int k;
	for (k = 0; !(i & (1 << k)); ++ k)
		;
	
	//printf("poz %d zero %d add %d\n", i, k, i + (1 << k));
	
	BIT[i] += v;
	
	BITAdd(i + (1 << k), v);

}

int BITQuery(int r) {
	if (r < 1)
		return 0;
	
	int k;
	for (k = 0; !(r & (1 << k)); ++ k)
		;
	
	return BIT[r] + BITQuery(r - (1 << k));
}

int main() {

	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);

	scanf("%d %d", &n, &m);
	memset(BIT, 0, sizeof(BIT));
	int i, v;
	for (i = 1; i <= n; ++ i) {		
		scanf("%d", &v);
		BITAdd(i, v);
	}
	int c, x, y;
	for (i = 1; i <= m; ++ i) {
		scanf("%d %d %d", &c, &x, &y);
		if (c == 0) {
			BITAdd(x, -y);
		} else {
			printf("%d\n", BITQuery(y) - BITQuery(x - 1));
		}
	}
	/*for (i = 1; i <= n; ++ i)
		printf("%d ", BIT[i]);
	printf("\n");*/

	return 0;
}