Cod sursa(job #2647668)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 5 septembrie 2020 18:11:06
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>

using namespace std;

void update(int poz, int x, int arb[], int n) {
	int c =0;
	while(poz<=n) {
		arb[poz] += x;
		while( ! (poz & (1<<c))) ++c;
		poz += (1<<c);
		++c;
	}
}

int query(int poz, int arb[], int n) {
	int s = 0, c = 0;
	while(poz > 0) {
		s+= arb[poz];
		while (! (poz & (1<<c))) ++c;
		poz -= (1<<c);
		++c;
	}
	return s;
}

int searchval(int x, int arb[], int n) {
	int step = 1;
	while (step < n) step *= 2;

	for(int i=0; step; step /= 2) {
		if (i + step <=n && x >= arb[i+step]) {
			x -= arb[i+step];
			i += step;
			if (x == 0)
				return i;
		}
	}

	return -1;
}




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

	int n, m, x, y, t;

	scanf("%d%d", &n, &m);
	int arb[n+1];
	for(int i=0; i<=n; ++i)
		arb[i] = 0;

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

	for(int i=1; i<=m; ++i) {
		scanf("%d", &t);

		switch(t) {
			case 0:
				scanf("%d%d", &x, &y);
				update(x, y, arb, n);
				break;
			case 1:
				scanf("%d%d", &x, &y);
				printf("%d\n", query(y, arb, n) - query(x-1, arb, n));
				break;
			case 2:
				scanf("%d", &x);
				printf("%d\n", searchval(x, arb, n));
				break;
		}
	}

	return 0;
}