Cod sursa(job #217644)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 29 octombrie 2008 11:16:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>

const int N_MAX = 100010;

int N, M, aib[N_MAX], v[N_MAX];

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

void constr()
{
	for (int i = 1; i <= N; i ++) {
		aib[i] += v[i];
		aib[tata(i)] += aib[i];
	}
}

void update(int poz, int val)
{
	while (poz <= N) {
		aib[poz] += val;
		poz = tata(poz);
	}
}

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

	return sum;
}

int find(int a)
{
	int i, step;
	for (step = 1; step < N; step <<= 1);
	for (i = 0; step; step >>= 1) {
		if (i + step <= N && query(i + step) <= a) i += step;
	}

	if (query(i) == a) return i;
	else return -1;
}

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

	scanf("%d %d\n", &N, &M);
	for (int i = 1; i <= N; i++) {
		scanf("%d ", &v[i]);
	}

	constr();

	int op, a, b;
	for (int i = 1; i <= M; i ++) {
		scanf("%d ", &op);
		if (op == 0 || op == 1) {
			scanf("%d %d\n", &a, &b);
			if (op == 0) update(a, b);
			else printf("%d\n", query(b) - query(a - 1));
		} else {
			scanf("%d\n", &a);
			if (a == 0) printf("-1\n");
			else printf("%d\n", find(a));
		}
	}

	return 0;
}