Cod sursa(job #2563197)

Utilizator CriviCriveanu Bogdan Crivi Data 1 martie 2020 02:28:09
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;

ifstream in;
ofstream out;

int tree[400005];

int n, minim, m;

void build(int poz, int val)
{
	while (poz <= n)
	{
		tree[poz] =tree[poz] + val;
		poz = poz + (poz & (-poz));
	}
}

void query(int vert, int lf, int rg, int a, int b)
{
	if (a <= lf and rg <= b)
	{
		minim += tree[vert];
	}
	else
	{
		int mid = (lf + rg) / 2;
		if (a <= mid)
			query(2 * vert, lf, mid, a, b);
		if (b > mid)
			query(2 * vert + 1, mid + 1, rg, a, b);
	}
}

void update(int vert, int lf, int rg, int a, int b)
{
	if (lf == rg)
	{
		tree[vert] += b;
	}
	else
	{
		int mid = (lf + rg) / 2;
		if (a <= mid)
			update(2 * vert, lf, mid, a, b);
		if (a > mid)
			update(2 * vert + 1, mid + 1, rg, a, b);
		tree[vert] = tree[vert * 2] + tree[vert * 2 + 1];
	}
}

int bin_ser(int k, int a, int b)
{
	int mid;
	while (a <= b)
	{
		mid = (a + b) / 2;
		minim = 0;
		query(1, 1, n, 1, mid);
		if (minim == k)
			return mid;
		if (minim < k)
		{
			a = mid + 1;
		}
		else
			b = mid - 1;
	}
	return -1;
}

int main()
{
	in.open("aib.in");
	out.open("aib.out");

	in >> n >> m;

	for (int i = 1; i <= n; i++)
	{
		in >> minim;
		build(i,minim);
	}
	for (int i = 1; i <= 4 * n; i++)
		out << tree[i] << " ";
	out << endl;
	int p, a, b;

	for (int i = 0; i < m; i++)
	{
		in >> p;
		//out << p << a << b << endl;
		if (p == 1)
		{
			in >> a >> b;
			minim = 0;
			query(1, 1, n, a, b);
			out << minim << '\n';
		}
		else
		{
			if (p == 0)
			{
				in >> a >> b;
				update(1, 1, n, a, b);
			}
			else
			{
				in >> a;
				out << bin_ser(a, 1, n) << '\n';
			}
		}

	}
	out.close();
	return 0;
}