Cod sursa(job #3164436)

Utilizator juincPopescu Marian juinc Data 3 noiembrie 2023 11:36:35
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>

int tree[100005];

void add(int ind, int val, int n) {
	for (int i = ind; i <= n; i += (i & -i)) 
		tree[i] += val;
	
}

int query(int i) {
	int sum = 0;
	while (i > 0) {
		sum += tree[i];
		i -= (i & -i);
	}
	return sum;
}

int query2(int sum, int n) {
	int left = 1, right = n, mid = (left + right)/2;

	while (left <= right) {
		int res = query(mid);

		if (res == sum)
			return mid;

		if (res > sum)
			right = mid - 1;
		else
			left = mid + 1;

		mid = (left + right) / 2;
	}

	return -1;
}

int main() {
	std::ifstream fin("aib.in");
	std::ofstream fout("aib.out");

	int n, m;
	fin >> n >> m;

	for (int i = 1; i <= n; i++) {
		int temp;
		fin >> temp;
		add(i, temp, n);
	}

	for (int i = 0; i < m; i++) {
		int op;
		fin >> op;
		switch (op) {
		case 0:
			int i, val;
			fin >> i >> val;
			add(i, val, n);
			break;
		case 1:
			int a, b;
			fin >> a >> b;
			fout << query(b) - query(a-1) << '\n';
			break;
		case 2:
			int sum;
			fin >> sum;
			fout << query2(sum, n) << '\n';
		}
	}

	return 0;
}