Cod sursa(job #2575412)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 6 martie 2020 13:22:04
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

using namespace std;

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

const int MAXN = 1e5;
const int MAXM = 15e4;
const int MAXVAL = 1e4;

int n, m;
int aib[MAXN + 1];

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

int query(int idx) {
	int ret = 0;
	while (idx > 0) {
		ret += aib[idx];
		idx -= idx & (-idx);
	}
	return ret;
}

int main() {
	in >> n >> m;
	int nr;
	for (int i = 1; i <= n; ++ i) {
		in >> nr;
		update(i, nr);
	}

	int q, a, b;
	for (int i = 1; i <= m; ++ i) {
		in >> q;
		if (q == 0) {
			in >> a >> b;
			update(a, b);
		}
		if (q == 1) {
			in >> a >> b;
			out << query(b) - query(a - 1) << '\n';
		}
		if (q == 2) {
			in >> a;
			int bitmask = 0;
			int sum = 0;
			int bit = 20;
			while (bit >= 0) {
				if ((1 << bit) + bitmask <= n && sum + aib[(1 << bit) + bitmask] < a) {
					bitmask += 1 << bit;
					sum += aib[bitmask];
				}
				-- bit;
			}
			++ bitmask;
			if (query(bitmask) == a) out << bitmask << '\n';
			else out << -1 << '\n';
		}
	}
	return 0;
}