Cod sursa(job #173678)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 7 aprilie 2008 22:33:19
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>

using namespace std;

const int NMAX = 1 << 17;

int N, AIB[NMAX];

void update(int p, int v) {
	for (; p <= N; p += p & ~(p - 1))
		AIB[p] += v;
}

int query(int p) {
	int r;

	for (r = 0; p; p -= p & ~(p - 1))
		r += AIB[p];
	
	return r;
}

int main(void) {
	ifstream fin("aib.in");
	ofstream fout("aib.out");
	int M, i, u, v, t, a, b, p;

	fin >> N >> M;
	
	for (i = 1; i <= N; ++i)
		fin >> u, update(i, u);

	for (i = 0; i < M; ++i) {
		fin >> t;

		if (t == 0) {
			fin >> a >> b;
			update(a, b);
		} else if (t == 1) {
			fin >> a >> b;
			fout << query(b) - query(a - 1) << '\n';
		} else {
			fin >> a;
			for (p = 1; (p << 1) <= N; p <<= 1);
			for (b = 0; p; p >>= 1)
				if ((v = b + p) <= N && query(v) < a)
					b = v;
			fout << (query(b + 1) == a ? b + 1 : -1) << '\n';
		}
	}

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

	return 0;
}