Cod sursa(job #2387579)

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


void updateInterv(std::vector<int>& tree, int node, int left, int right, int pos, int val)
{
	if (left == right && left == pos) {
		tree[node] += val;
	} else {
		int mid = (left + right) / 2;
		if (pos <= mid) {
			updateInterv(tree, 2*node, left, mid, pos, val);
		} else {
			updateInterv(tree, 2*node + 1, mid+1, right, pos, val);
		}
		
		tree[node] = tree[2*node] + tree[2*node+1];
	}
}

int queryInterv(std::vector<int>& tree, int node, int left, int right, int a, int b)
{
	if (a <= left && b >= right) {
		return tree[node];
	} else {
		int mid = (left + right) / 2;
		int leftSum = 0, rightSum = 0;
		if (a <= mid) {
			leftSum += queryInterv(tree, 2*node, left, mid, a, b);
		} 
		if (b > mid) {
			rightSum += queryInterv(tree, 2*node+1, mid+1, right, a, b);
	 	}
		return leftSum + rightSum;
	}
	return 0;
}

int binSearch(std::vector<int>& tree, int N, int a)
{
	int left = 0, right = N;
	while (right - left > 1) {
		int mid = (left + right) / 2;
		int valMid = queryInterv(tree, 1, 1, N, 1, mid);
		if (valMid >= a) {
			right = mid;
		} else {
			left = mid;
		}
	}
	
	int valRight = queryInterv(tree, 1, 1, N, 1, right);
	if (valRight == a) {
		return right;
	} 
	
	return -1;
}


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

	int N, M;
	in >> N >> M;
	std::vector<int> tree(N*ceilf(log(N)));
	for (int i = 1; i <= N; ++ i) {
		int x;
		in >> x;
		updateInterv(tree, 1, 1, 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;
			updateInterv(tree, 1, 1, N, a, b);
		} else if (op == '1') {
			in >> a >> b;
			out << queryInterv(tree, 1, 1, N, a, b) << "\n";
		} else if (op == '2') {
			in >> a;
			out << binSearch(tree, N, a) << "\n";
		}
	}
	
	in.close();
	out.close();

	return 0;
}