Cod sursa(job #1463501)

Utilizator voillpalMihai Voinea voillpal Data 21 iulie 2015 02:20:56
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<cstdio>
using namespace std;

int aib[100005], n;

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

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

int solve(int val) {
	int step = 1, ans = 0;
	while (step * 2 <= n) {
		step *= 2;
	}
	while (step >= 1) {
		if (ans + step <= n && aib[ans + step] <= val && val != 0) {
			val -= aib[ans + step];
			ans += step;
		}

		step /= 2;
	}
	if (val != 0) ans = -1;
	return ans;
}

int main() {
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	int i, m, type, a, b;
	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++) {
		scanf("%d", &a);
		update(i + 1, a);
	}
	for (i = 0; i < m; i++) {
		scanf("%d", &type);
		if (type == 0) {
			scanf("%d %d", &a, &b);
			update(a, b);
		} else {
			if (type == 1) {
				scanf("%d %d", &a, &b);
				printf("%d\n", query(b) - query(a-1));
			} else {
				scanf("%d", &a);
				printf("%d\n", solve(a));
			}
		}
	}
	return 0;
}