Cod sursa(job #2553113)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 21 februarie 2020 17:04:25
Problema Arbori indexati binar Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#define MAX 100005
#define zeros(x) (x ^ (x - 1) & x)

int n, m, x, a, b;
int aib[MAX];

void add(int *aib, int pos, int val) {
	for (int i = pos; i <= n; i += zeros(i))
		aib[i] += val;
}

int sum(int *aib, int pos) {
	int res = 0;
	for (int i = pos; i > 0; i -= zeros(i))
		res += aib[i];
	return res;
}

int get_sum_pos(int *aib, int val) {
	int l = 1, r = n, mid, sum_val;

	while (l <= r) {
		mid = (l + r) / 2;
		sum_val = sum(aib, mid);
		if (sum_val == val)
			return mid;
		if (sum_val > val)
			r = mid - 1;
		else
			l = mid + 1;
	}

	return -1;
}

int main() {
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &x);
		add(aib, i, x);
	}

	for (int i = 0; i < m; ++i) {
		scanf("%d", &x);
		switch (x) {
			case 0: {
				scanf("%d%d", &a, &b);
				add(aib, a, b);
			} break;
			case 1: {
				scanf("%d%d", &a, &b);
				printf("%d\n", sum(aib, b) - sum(aib, a - 1));
			} break;
			case 2: {
				scanf("%d", &a);
				printf("%d\n", get_sum_pos(aib, a));
			}
		}
	}

	return 0;
}