Cod sursa(job #2713557)

Utilizator StefanSanStanescu Stefan StefanSan Data 28 februarie 2021 11:20:34
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include      <iostream>
#include      <fstream>

using namespace std;

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

int n, m, v[100005], aib[100005];

int zero(int x) {
	return ((x ^ (x - 1)) & x);
}

void add(int x, int quantity) {
	for (int i = x; i <= n; i += zero(i)) aib[i] += quantity;
}

int query(int a) {
	int rez = 0;
	for (int i = a; i > 0; i -= zero(i)) rez += aib[i];
	return rez;
}

void search(int val) {
	int left = 1, right = n;
	while (left <= right) {
		int mid = (left + right) / 2;
		if (query(mid) >= val) right = mid - 1;
		else left = mid + 1;
	}
	if (query(right + 1) != val)
		out << -1 << '\n';
	else out << right + 1 << '\n';
}

int main() {

	ios::sync_with_stdio(false);
	in.tie(NULL), out.tie(NULL);

	in >> n >> m;

	for (int i = 1; i <= n; i++) {
		in >> v[i];
		for (int j = i - zero(i) + 1; j <= i; j++) aib[i] += v[j];
	}
	while (m--) {
		int op, a, b;
		in >> op;
		if (op == 0) {
			in >> a >> b;
			add(a, b);
		}
		if (op == 1) {
			in >> a >> b;
			out << query(b) - query(a - 1) << '\n';
		}
		if (op == 2) {
			in >> a;
			search(a);
		}
	}

	return 0;
}