Cod sursa(job #1418437)

Utilizator alexandru.huleaAlexandru Hulea alexandru.hulea Data 13 aprilie 2015 02:59:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define zeros(x) ( (x ^ (x - 1)) & x )

using namespace std;

// adauga la valoarea de pe indexul x din a valoarea val
void add(int x, int n, int val, int* aib) {
	for (int j = x; j <= n; j += zeros(j)) {
		aib[j] += val;
	}
}

// calculeaza suma primelor x valori din a
int compute(int x, int* aib) {
	int result = 0;
	for (int i = x; i > 0; i -= zeros(i)) {
		result += aib[i];
	}
	return result;
}

int main() {

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

	int n, m;
	scanf("%i", &n);
	scanf("%i", &m);
	int* a = (int*)malloc((n + 1) * sizeof(int));
	int* aib = (int*)calloc(n +  1, sizeof(int));
	a[0] = 0;
	aib[0] = 0;
	for (int i = 1; i <= n; i++) {
		scanf("%i", a + i);
		add(i, n, a[i], aib);
	}
	for (int i = 0; i < m; i++) {
		int cod;
		scanf("%i", &cod);
		if (cod == 0) {
			int t, v;
			scanf("%i", &t);
			scanf("%i", &v);
			add(t, n, -v, aib);
		}
		else {
			int p, q;
			scanf("%i", &p);
			scanf("%i", &q);
			int sum1 = compute(q, aib);
			int sum2 = compute(p - 1, aib);
			printf("%i\n", sum1 - sum2);
		}
	}

	fclose(stdin);
	fclose(stdout);
	return 0;

}