Cod sursa(job #3240220)

Utilizator 0021592Grecu rares 0021592 Data 13 august 2024 11:23:46
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100010], i, n, j, k, a, b;
void update(int poz, int val)
{
	for (int i = poz; i <= n; i = i + (i & (-i)))
		aib[i] += val;
}
int query(int poz)
{
	int s = 0;
	for (int i = poz; i >= 1; i = i - (i & (-i)))
		s += aib[i];
	return s;
}
int main()
{
	in >> n >> k;
	for (i = 1; i <= n; i++)
	{
		in >> a;
		update(i, a);
	}
	for (i = 1; i <= k; i++)
	{
		in >> j >> a;
		if (j == 2)
		{
			int p2 = 1 << (int)log2(n); ///ok? 2^(log2(n))	
			int poz = 0;
			int s = 0;
			for (; p2 >= 1; p2 = p2 / 2)
				if (poz + p2 <= n && s + aib[poz + p2] < a)
				{
					s = s + aib[poz + p2];
					poz = poz + p2;
				}
			if (poz == n || s + query(poz + 1) - query(poz) != a)
				out << -1 << '\n';
			else
				out << poz + 1 << '\n';
			continue;
		}
		in >> b;
		if (j == 0)
			update(a, b);
		else if (j == 1)
			out << query(b) - query(a - 1) << '\n';
	}
}