Cod sursa(job #482407)

Utilizator Addy.Adrian Draghici Addy. Data 3 septembrie 2010 15:24:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>

const int NMAX = 100050;

int AIB[NMAX], n, m, i, tip, a, b;

int query (int), search (int);
void update (int, int);

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

void update (int i, int x) {
	
	while (i <= n) {
		AIB[i] += x;
		i += i & (-i);
	}
}

int query (int i) {
	
	int s = 0;
	
	while (i > 0) {
		s += AIB[i];
		i -= i & (-i);
	}
	
	return s;
}

int search (int x) {
	
	int p, u, mid, poz, val;
	
	p = 1, u = n, poz = 0;
	while (p <= u) {
		mid = (p + u) >> 1, val = query (mid);
		if (val >= x) {
			if (x == val) poz = mid;
			u = mid - 1;
		}
		else
			p = mid + 1;
	}
	
	return poz ? poz : -1;
}