Cod sursa(job #808648)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 7 noiembrie 2012 04:08:15
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
using namespace std;
int n, nOp, poz, c[100001];

int lowbit(int x){
	return x & (-x);
}

void Actualizare(int ind, int val){
	while (ind <= n){
		c[ind] += val;
		ind += lowbit(ind);
	}
}

int Suma(int ind){
	int s = 0;
	while (ind > 0){
		s += c[ind];
		ind -= lowbit(ind);
	}
	return s;
}

int Suma(int x, int y){return Suma(y) - Suma(x-1);}
int Cauta(int x){
	int i = 0, ind = 0;
	for (ind = 1; ind < n; ind <<= 1);
	
	for (i = 0; ind; ind >>= 1)
		if (i + ind <= n && c[i + ind] <= x){
			i += ind;
			x -= c[i];
			if (x == 0) return i;
		}
	return -1;
}

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