Cod sursa(job #116352)

Utilizator scvalexAlexandru Scvortov scvalex Data 18 decembrie 2007 14:38:25
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <iostream>
#include <fstream>

using namespace std;

int N(0),
	M(0);
int A[15001];
int bst[15001];

int trailling_zeros(int n) {
	if (0 == n)
		return 0;

	int r(0);

	for (int i(1); !(n & i); i <<= 1, ++r);

	return r;
}

void bst_mod_value(int pos, int dif) {
	int i = pos;
	while (i <= N) {
		bst[i] += dif;
		i += 1<<trailling_zeros(i);
	}
}

void build_bst() {
	for (int i(1); i <= N; ++i) 
		bst_mod_value(i, A[i]);
}

int bst_1range_value(int end) {
	if (end <= 0)
		return 0;

	int i = end;
	int r(0);
	while (i >= 1) {
		r += bst[i];
		i -= 1<<trailling_zeros(i);
	}

	return r;
}

int bst_interval_value(int p, int q) {
	return bst_1range_value(q) - bst_1range_value(p - 1);
}

int main(int argc, char *argv[]) {
	ifstream fin("datorii.in");
	ofstream fout("datorii.out");
	fin >> N >> M;
	for (int i(1); i <= N; ++i)
		fin >> A[i];

	build_bst();

	int a(0),
		b(0),
		c(0);
	for (int i(0); i < M; ++i) {
		fin >> c >> a >> b;
		if (1 == c) {
			fout << bst_interval_value(a, b) << endl;
		} else {
			bst_mod_value(a, -b);
		}
	}

	fout.close();
	fin.close();

	return 0;
}