Cod sursa(job #2202544)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 9 mai 2018 01:03:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#define zeros(x) (x & -x)
#define MAX 100005
using namespace std;

int n, m, t, x, y;
int aib[MAX];

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

int query(int pos) {
	int sum = 0;

	for (int i = pos; i; i -= zeros(i))
		sum += aib[i];

	return sum;
}

int cb(int x) {
	int l = 1, r = n;
	int m, sum;

	while (l <= r) {
		m = (l + r) / 2;
		sum = query(m);

		if (sum == x)
			return m;
		if (sum < x)
			l = m + 1;
		else
			r = m - 1;
	}

	return -1;
}

int main() {
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);

	scanf("%d%d\n", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &x);
		update(i, x);
	}

	for (int i = 0; i < m; ++i) {
		scanf("%d%d", &t, &x);
		if (t == 0) {
			scanf("%d", &y);
			update(x, y);
		}
		else if (t == 1) {
			scanf("%d", &y);
			printf("%d\n", query(y) - query(x - 1));
		}
		else
			printf("%d\n", cb(x));
	}

	return 0;
}