Cod sursa(job #173934)

Utilizator MariusMarius Stroe Marius Data 8 aprilie 2008 12:08:00
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

using namespace std;

const char iname[] = "aib.in";
const char oname[] = "aib.out";

#define FOR(i, a, b) for (int i = (a); i <= (b); ++ i)
#define MAXN  100005
#define ultbit(i)  i & ~(i - 1)


int main(void)
{
	ifstream fin(iname);
	ofstream fout(oname);

	int n, cnt, A[MAXN] = {0};
	int val, p, type, a, b, sum, X, w;

	fin >> n >> cnt;
	FOR (i, 1, n) {
		fin >> val;
		for (p = i; p <= n; p += ultbit(p))
			A[p] += val;
	}

	for (; cnt > 0; -- cnt)
	{
		fin >> type;

		if (type == 0)
		{
			fin >> p >> val;
			for (; p <= n; p += ultbit(p))
				A[p] += val;
		} else if (type == 1) {
			fin >> a >> b;
			for (sum = 0; b > 0; b -= ultbit(b))
				sum += A[b];
			for (a --; a > 0; a -= ultbit(a))
				sum -= A[a];

			fout << sum <<'\n';
		} else if (type == 2) {
			fin >> X;
			for (int i = sum = 0, w = 1 << 16; w > 0; w >>= 1)
				if (i + w <= n && sum + A[i + w] <= X)
					sum += A[i + w],
					i += w;

			if (sum == X && X)
				fout << i <<'\n';
			else
				fout << -1 <<'\n';
		}
	}

	fin.close(), fout.close();
	return 0;
}