Cod sursa(job #2663190)

Utilizator sebimihMihalache Sebastian sebimih Data 25 octombrie 2020 16:03:03
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

struct node
{
	int StLibere, DrLibere, TotLibere;
};

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].TotLibere = max(arb[ti * 2].TotLibere, arb[ti * 2 + 1].TotLibere, 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].TotLibere = 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].TotLibere = 0;
		}
		else
		{
			arb[ti].DrLibere = arb[ti].StLibere = arb[ti].TotLibere = 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].TotLibere = 0;
		}
		else
		{
			arb[ti].DrLibere = arb[ti].StLibere = arb[ti].TotLibere = 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].TotLibere << '\n';
		}
		else
		{
			int l, nr;
			fin >> l >> nr;
			int r = l + nr - 1;
			update(c, l, r);
		}
	}
}