Cod sursa(job #3151238)

Utilizator dragutamihai1234Draguta Mihai dragutamihai1234 Data 20 septembrie 2023 12:27:59
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

struct node
{
	int stLibere, drLibere, totalLibere;
};

const int N = 100005;

int n, q;
node arb[4 * N];
int lazy[4 * N];

int max(int a, int b, int c)
{
	return max(max(a, b), c);
}

void updateNode(int ti, int tl, int tr)
{
	arb[ti].totalLibere = max(arb[ti * 2].totalLibere, arb[ti * 2 + 1].totalLibere, arb[ti * 2].drLibere + arb[ti * 2 + 1].stLibere);

	int mid = (tl + tr) / 2;

	arb[ti].stLibere = arb[ti * 2].stLibere;
	if (arb[ti].stLibere == mid - tl + 1)
	{
		arb[ti].stLibere += arb[ti * 2 + 1].stLibere;
	}

	arb[ti].drLibere = arb[ti * 2 + 1].drLibere;
	if (arb[ti].drLibere == tr - mid)
	{
		arb[ti].drLibere += arb[ti * 2].drLibere;
	}
}

void build(int tl = 1, int tr = n, int ti = 1)
{
	if (tl == tr)
	{
		arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = 1;
		return;
	}

	int mid = (tl + tr) / 2;
	build(tl, mid, ti * 2);
	build(mid + 1, tr, ti * 2 + 1);
	updateNode(ti, tl, tr);
}

void update(int qt, int ql, int qr, int tl = 1, int tr = n, int ti = 1)
{
	// 1 = ocupa camere
	// 2 = elibereaza camere

	int lungime = tr - tl + 1;
	if (lazy[ti])
	{
		if (lazy[ti] == 1)
		{
			arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = 0;
		}
		else
		{
			arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = lungime;
		}

		if (tl < tr)
		{
			lazy[ti * 2] = lazy[ti * 2 + 1] = lazy[ti];
		}

		lazy[ti] = 0;
	}

	// not included
	if (tr < ql || qr < tl)
	{
		return;
	}

	// fully included
	if (ql <= tl && tr <= qr)
	{
		if (qt == 1)
		{
			arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = 0;
		}
		else
		{
			arb[ti].drLibere = arb[ti].stLibere = arb[ti].totalLibere = lungime;
		}

		if (tl < tr)
		{
			lazy[ti * 2] = lazy[ti * 2 + 1] = qt;
		}
		return;
	}

	// partial included
	int mid = (tl + tr) / 2;
	update(qt, ql, qr, tl, mid, ti * 2);
	update(qt, ql, qr, mid + 1, tr, ti * 2 + 1);
	updateNode(ti, tl, tr);
}

int main()
{
	fin >> n >> q;

	build();

	while (q--)
	{
		int c;
		fin >> c;
		if (c == 3)
		{
			fout << arb[1].totalLibere << '\n';
		}
		else
		{
			int l, nr;
			fin >> l >> nr;
			int r = l + nr - 1;
			update(c, l, r);
		}
	}
}