Cod sursa(job #1436358)

Utilizator gallexdAlex Gabor gallexd Data 15 mai 2015 19:46:22
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>

int N, M;
int tree[15100];

inline int lastDigit(int x) { // least significant bit with value 1
	return x & -x;
}

void add(int day, int val) {
	while (day <= N) {
		tree[day] += val;
		day += lastDigit(day);
	}
}

int sum(int start, int end) {
	int s = 0;
	--start;
	while (start != end) { // cat timp nu am ajuns la LCA
		if (start < end) { // adunam ce e pe ramura lui end
			s += tree[end]; 
			end -= lastDigit(end);
		} else { // si scadem ce e pe ramura lui start
			s -= tree[start]; 
			start -= lastDigit(start);
		}
		
	}
	return s;
}

int main () {

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

	int val, cmd, arg1, arg2;
	scanf("%d %d", &N, &M);
	for (int i=1; i<=N; ++i) {
		scanf("%d", &val);
		add(i, val);
	}

	for (;M;--M) {
		scanf("%d %d %d", &cmd, &arg1, &arg2);
		if (!cmd)
			add(arg1, -arg2);
		else
			printf("%d\n", sum(arg1, arg2));
	}
	
	return 0;
}