Cod sursa(job #2064868)

Utilizator oanaroscaOana Rosca oanarosca Data 12 noiembrie 2017 22:54:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

#define p2(x) (x ^ (x-1)) & x

using namespace std;

int n, operatii, a[100001], pas_init;

void adauga (int poz, int val) {
	for (int i = poz; i <= n; i += p2(i))
		a[i] += val;
}

int suma (int poz) {
	int s = 0;

	for (int i = poz; i > 0; i -= p2(i))
		s += a[i];
	return s;
}

int cauta (int val) {
	int pas = pas_init, i;
	for (i = 0; pas; pas >>= 1)
		if (i+pas <= n and a[i+pas] <= val) {
			i += pas; val -= a[i];
			if (!val)
				return i;
		}
	return -1;
}

int main () {
	int x, o, a, b;

	ifstream fi("aib.in");
	ofstream fo("aib.out");
	fi >> n >> operatii;
	for (pas_init = 1; pas_init < n; pas_init <<= 1);
	for (int i = 1; i <= n; i++)
		fi >> x, adauga(i, x);
	for (int i = 1; i <= operatii; i++) {
		fi >> o >> a;
		if (o == 0)
			fi >> b, adauga(a, b);
		else
			if (o == 1)
				fi >> b, fo << suma(b)-suma(a-1) << '\n';
			else
				fo << cauta(a) << '\n';
	}
	return 0;
}