Cod sursa(job #173538)

Utilizator MariusMarius Stroe Marius Data 7 aprilie 2008 20:21:46
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 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 & (i - 1))


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

	int n, cnt, A[MAXN] = {0};

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

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

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

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

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