Cod sursa(job #1654533)

Utilizator vladttturcuman vlad vladtt Data 17 martie 2016 10:31:06
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
// Tree Sequence.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <fstream>
#include <vector>

#define NMax 100010
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

int a, b, i, n, m, t, x;

int max(int a, int b)
{
	return a < b ? b : a;
}

struct nod {
	int MaxSequence;
	int st;
	int dr;
	int lazy;
};

nod p[4 * NMax];

void propagate(int nod,int in,int sf)
{
	p[nod * 2].lazy = p[nod * 2 + 1].lazy = p[nod].lazy;
	p[nod].lazy = 0;

	if (p[nod * 2].lazy == 0)
	{
		p[nod * 2].MaxSequence = p[nod * 2].st = p[nod * 2].dr = p[nod * 2 + 1].MaxSequence = p[nod * 2 + 1].st = p[nod * 2 + 1].dr = 0;
		return;
	}

	int mij = (in + sf) / 2;
	p[nod * 2].MaxSequence = p[nod * 2].st = p[nod * 2].dr = mij - in + 1;
	p[nod * 2 + 1].MaxSequence = p[nod * 2 + 1].st = p[nod * 2 + 1].dr = sf - mij;
}

void ReThinkMax(int nod,int in,int sf)
{
	p[nod].MaxSequence = max(max(p[nod * 2].MaxSequence, p[nod * 2 + 1].MaxSequence), p[nod * 2].dr + p[nod * 2].st);

	int mij = (in + sf) / 2;

	p[nod].st = p[nod * 2].st;
	p[nod].dr = p[nod * 2 + 1].dr;

	if (p[nod * 2].st == mij - in + 1)
		p[nod].st = p[nod * 2].st + p[nod * 2 + 1].st;


	if (p[nod * 2+1].dr == sf - mij)
		p[nod].dr = p[nod * 2].dr + p[nod * 2 + 1].dr;
}

void Update(int nod, int in, int sf, int a, int b,int val)
{
	if (a<=in &&  b>=sf)
	{
		p[nod].lazy = val;
		if(val==1)
			p[nod].dr = p[nod].st = p[nod].MaxSequence = sf - in + 1;
		else
			p[nod].dr = p[nod].st = p[nod].MaxSequence = 0;

		return;
	}

	if (p[nod].lazy)
		propagate(nod,in,sf);

	int mij = (in + sf) / 2;

	if (mij >= a)
		Update(nod * 2, in, mij, a, b, val);
	if(mij < b)
		Update(nod * 2 + 1, mij + 1, sf, a, b, val);

	ReThinkMax(nod,in,sf);
}

void init(int nod, int in, int sf)
{
	p[nod].MaxSequence = p[nod].dr = p[nod].st = sf - in + 1;

	int mij = (in + sf) / 2;

	if (in != sf)
	{
		init(nod * 2, in, mij);
		init(nod * 2 + 1, mij + 1, sf);
	}

}

int main()
{

	fin >> n >> x;

	init(1, 1, n);

	for (i = 1; i <= x; i++)
	{
		fin >> t ;
		if (t==1)
		{
			fin >> a >> m;
			Update(1, 1, n, a, a + m - 1, -1);
			continue;
		}

		if (t == 2)
		{
			fin >> a >> m;
			Update(1, 1, n, a, a + m - 1, 1);
			continue;
		}

		fout<< p[1].MaxSequence << '\n';
	}



	return 0;
}