Cod sursa(job #1590090)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 4 februarie 2016 18:32:34
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

#define NMax 100010

using namespace std;

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

int n, queries, elem[NMax], BIT[NMax];

void updateBIT(int pos, int val)
{
	while (pos <= n) {
		BIT[pos] += val;
		pos = pos + (pos & (-pos));
	}
}

int getSum(int pos)
{
	int answ = 0;

	while (pos > 0) {
		answ += BIT[pos];
		pos = pos - (pos & (-pos));
	}

	return answ;
}

int binSrc(int sum)
{
	int st = 1;
	int dr = n;
	int answ = -1;

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

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

	return answ;
}

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

	for (int i = 1; i <= n; i++) {
		f >> elem[i];

		updateBIT(i, elem[i]);
	}

	int cmd, x, y;
	for (int i = 1; i <= queries; i++) {
		f >> cmd;
		if (cmd == 0) {
			f >> x >> y;
			updateBIT(x, y);
		}
		else if (cmd == 1) {
			f >> x >> y;
			g << getSum(y) - getSum(x - 1) << "\n";
		}
		else {
			f >> x;
			g << binSrc(x) << "\n";
		}
	}

}