Cod sursa(job #1554122)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 20 decembrie 2015 22:36:14
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>

#define NMax 100010

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int numElem, queries, BIT[NMax];

int getSum(int idx)
{
	int sum = 0;

	while (idx > 0) {
		sum += BIT[idx];
		idx = idx - (idx & (-idx));
	}

	return sum;
}

void update(int idx, int val)
{
	while (idx <= numElem) {
		BIT[idx] += val;
		idx = idx + (idx & (-idx));
	}
}

int findSum(int sum)
{
	int st = 1, dr = numElem, sol = -1;

	while (st <= dr) {
		int mid = (st + dr) / 2;

		if (getSum(mid) >= sum) {
			dr = mid - 1;
			if (getSum(mid) == sum)
				sol = mid;
		}
		else
			st = mid + 1;
	}

	return sol;
}

int main()
{
	f >> numElem >> queries;

	int elem;
	for (int i = 1; i <= numElem; i++) {
		f >> elem;

		update(i, elem);
	}

	int cmd, val1, val2;
	for (int i = 1; i <= queries; i++) {
		f >> cmd;

		if (cmd == 0) {
			f >> val1 >> val2;

			update(val1, val2);
		}
		else if (cmd == 1) {
			f >> val1 >> val2;

			g << getSum(val2) - getSum(val1 - 1) << "\n";
		}
		else {
			f >> val1;

			g << findSum(val1) << "\n";
		}

	}
}