Cod sursa(job #2387596)

Utilizator vlad_popaVlad Popa vlad_popa Data 24 martie 2019 21:36:08
Problema Arbori indexati binar Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>


void updateAib(std::vector<int>& tree, int N, int pos, int val)
{
	for (int i = pos; i <= N; i += (i & (-i))) {
		tree[i] += val;
	}
}

int queryAib(std::vector<int>& tree, int pos)
{
	int sum = 0;
	for (int i = pos; i; i -= (i & (-i))) {
		sum += tree[i];
	}
	return sum;
}

int binSearch(std::vector<int>& tree, int N, int a)
{
	int step, i;
	for (step = 1; step < N; step <<= 1);
	for (i = 0; step; step >>= 1) {
		if (i + step <= N && tree[i+step] <= a) {
			i += step;
			a -= tree[i];
		}
	} 
	
	if (a == 0 && i) {
		return i;
	}
	
	return -1;
}


int main ()
{
	std::ifstream in("aib.in");

	int N, M;
	in >> N >> M;
	std::vector<int> tree(N+1);
	for (int i = 1; i <= N; ++ i) {
		int x;
		in >> x;
		updateAib(tree, N, i, x);
	}
	
	std::ofstream out("aib.out");
	for (int i = 0; i < M; ++ i) {
		char op;
		int a, b;
		in >> op;
		if (op == '0') {
			in >> a >> b;
			updateAib(tree, N, a, b);
		} else if (op == '1') {
			in >> a >> b;
			out << queryAib(tree, b) - queryAib(tree, a-1) << "\n";
		} else if (op == '2') {
			in >> a;
			out << binSearch(tree, N, a) << "\n";
		}
	}
	
	in.close();
	out.close();

	return 0;
}