Cod sursa(job #2939083)

Utilizator average_disappointmentManolache Sebastian average_disappointment Data 12 noiembrie 2022 23:18:27
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#pragma warning(disable : 4996);
#include <stdio.h>

using namespace std;

FILE *cin, *cout;
 
const int nmax = 1e5;
int n, m, aib[nmax + 1];

int read_cum(int index) {

	int sum = 0;
	while (index > 0) {

		sum += aib[index];
		index -= (index & -index);
	}

	return sum;
}

void update(int index, int val) {

	while (index <= n) {

		aib[index] += val;
		index += (index & -index);
	}
}

int read(int index) {

	int sum = aib[index];

	if (index > 0) {

		int lca = index - (index & -index);
		index--;

		while (index != lca) {

			sum -= aib[index];
			index -= (index & -index);
		}
	}

	return sum;
}

int find_smallest(int cum) {

	int index = 0, bitmask = 1, ans = -1;

	while (bitmask <= n)
		bitmask <<= 1;
	bitmask >>= 1;

	while (bitmask != 0) {

		int mid = index + bitmask;
		bitmask >>= 1;

		if (mid > n)
			continue;
		if (aib[mid] == cum)
			ans = mid;
		if (aib[mid] < cum) {

			index = mid;
			cum -= aib[mid];
		}
	}

	return ans;
}

int main() {

	cin = fopen("aib.in", "r");
	cout = fopen("aib.out", "w");

	fscanf(cin, "%d %d", &n, &m);

	for (int i = 1; i <= n; i++) {

		int x;
		fscanf(cin, "%d", &x);

		update(i, x);
	}

	for (int i = 1; i <= m; i++) {

		int q;
		fscanf(cin, "%d", &q);

		if (q == 0) {

			int x, y;
			fscanf(cin, "%d %d", &x, &y);
			update(x, y);
		}
		else if (q == 1) {

			int x, y;
			fscanf(cin, "%d %d", &x, &y);
			fprintf(cout, "%d\n", read_cum(y) - read_cum(x - 1));
		}
		else {

			int x;
			fscanf(cin, "%d", &x);
			fprintf(cout, "%d\n", find_smallest(x));
		}
	}
}