Cod sursa(job #2462668)

Utilizator gabib97Gabriel Boroghina gabib97 Data 27 septembrie 2019 18:40:45
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
#define N 100005
#define z(i) (i)&(-i)

using namespace std;

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

void update(int pos, int val) {
	for (int i = pos; i <= n; i += z(i))
		aib[i] += val;
}

int get(int pos) {
	int res = 0;
	for (int i = pos; i > 0; i -= z(i))
		res += aib[i];
	return res;
}

int find_pos(int sum) {
	int width = 1;
	while (width <= n) width <<= 1;

	int pos = 0;
	for (width >>= 1; width; width >>= 1)
		if (pos + width <= n && aib[pos + width] <= sum) {
			pos += width;
			sum -= aib[pos];
		}
	return sum == 0 ? pos : -1;
}

int main() {
	freopen ("aib.in", "r", stdin);
	freopen ("aib.out", "w", stdout);
	scanf("%i%i", &n, &m);

	for (int i = 1; i <= n; i++) {
		scanf("%i", &v[i]);
		update(i, v[i]);
	}
	int a, b, t;
	while (m--) {
		scanf("%i", &t);
		switch (t) {
			case 0:
				scanf("%i%i", &a, &b);
				update(a, b);
				break;
			case 1:
				scanf("%i%i", &a, &b);
				printf("%i\n", get(b) - get(a - 1));
				break;
			case 2:
				scanf("%i", &a);
				printf("%i\n", find_pos(a));
		}
	}
	return 0;
}