Cod sursa(job #641823)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 29 noiembrie 2011 17:43:25
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <vector>
using namespace std;

int n, nOp;
vector <int> c;

void Actualizare(int x, int y){
	int ind = x, poz = 0;
	while (ind <= n){
		c[ind] += y;
		while ((ind & (1<<poz)) == 0) poz++;
		ind += (1<<poz);
		poz++;
	}
}

int Suma(int x){
	int s = 0, ind = x, poz = 0;
	while (ind > 0){
		s += c[ind];
		while ((ind & (1 << poz)) == 0) poz++;
		ind -= (1<<poz);
		poz++;
	}
	return s;
}

int Suma(int x, int y){return Suma(y) - Suma(x-1);}
int Cauta(int st, int dr, int x){
	int m = (st + dr) / 2;
	if (Suma(m) == x) return m;
	if (Suma(m) > x) return Cauta(st, m-1, x);
	return Cauta(m+1, dr, x);
}
int main()
{
	freopen ("aib.in", "r", stdin), freopen("aib.out", "w", stdout);
	scanf ("%d %d", &n, &nOp);
	int i, x, y, op;
	c.assign(n+1, 0);
	for (i = 1; i <= n; i++){
		scanf ("%d", &x);
		Actualizare (i, x);
	}
	
	for (i = 0; i < nOp; i++){
		scanf ("%d", &op);
		switch (op){
		case 0 : 
			scanf ("%d %d", &x, &y);
			Actualizare(x, y);
			break;
		case 1:
			scanf ("%d %d", &x, &y);
			printf ("%d\n", Suma(x, y));
			break;
		case 2:
			scanf ("%d", &x);
			printf ("%d\n", Cauta(1, n, x));
		}
	}
	return 0;
}