Cod sursa(job #2416543)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 27 aprilie 2019 18:08:59
Problema Arbori indexati binar Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 0.95 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, t, a, b;
int aib[MAXN + 1];

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

int query(int poz) {
	int sum = 0;
	while (poz) {
		sum += aib[poz];
		poz -= (poz & -poz);
	}
	return sum;
}

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

	while (m --) {
		in >> t;
		if (t == 0) {
			in >> a >> b;
			update(a, b);
		}
		if (t == 1) {
			in >> a >> b;
			out << query(b) - query(a - 1) << '\n';
		}
		if (t == 2) {
			in >> a;
			int ans = 0, sum = 0;
			for (int pas = 20; pas >= 0; -- pas) {
				if (ans + (1 << pas) <= n && sum + aib[ans + (1 << pas)] <= a) {
					ans += 1 << pas;
					sum += aib[ans];
				}
			}
			if (sum != a) out << -1 << '\n';
			else out << ans - 1 << '\n';
		}
	}

	return 0;
}