Pagini recente » Cod sursa (job #2636237) | Cod sursa (job #1813299) | Cod sursa (job #2908692) | Cod sursa (job #3165195) | Cod sursa (job #1308322)
#include <fstream>
const int NMAX = 100005;
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct noduri
{
int lenght;
int max_left;
int max_right;
};
int N,Q,l,op,L,R,M;
noduri nod[4*NMAX];
int maxim(int a, int b)
{
if (a > b)
return a;
return b;
}
void Update(int Nod, int left, int right, int val)
{
int mid = (left+right)/2;
if (L <= left && right <= R)
{
nod[Nod].lenght = (right-left+1)*val;
nod[Nod].max_left = (right-left+1)*val;
nod[Nod].max_right = (right-left+1)*val;
return;
}
if (nod[Nod].lenght == 0)
{
nod[Nod*2].lenght = nod[Nod*2].max_left = nod[Nod*2].max_right = 0;
nod[Nod*2+1].lenght = nod[Nod*2+1].max_left = nod[Nod*2+1].max_right = 0;
}
if (nod[Nod].lenght == right-left+1)
{
nod[Nod*2].lenght = nod[Nod*2].max_left = nod[Nod*2].max_right = mid-left+1;
nod[Nod*2+1].lenght = nod[Nod*2+1].max_left = nod[Nod*2+1].max_right = right-mid;
}
if (L <= mid)
{
Update(Nod*2,left,mid,val);
}
if (R > mid)
{
Update(Nod*2+1,mid+1,right,val);
}
if (nod[Nod*2].max_left == mid-left+1)
nod[Nod].max_left = nod[Nod*2].max_left + nod[Nod*2+1].max_left;
else nod[Nod].max_left = nod[Nod*2].max_left;
if (nod[Nod*2+1].max_right == right-mid)
nod[Nod].max_right = nod[Nod*2].max_right + nod[Nod*2+1].max_right;
else nod[Nod].max_right = nod[Nod*2+1].max_right;
nod[Nod].lenght = maxim(nod[Nod*2].lenght,nod[Nod*2+1].lenght);
nod[Nod].lenght = maxim(nod[Nod].lenght,nod[Nod*2].max_right+nod[Nod*2+1].max_left);
nod[Nod].lenght = maxim(nod[Nod].lenght,maxim(nod[Nod].max_left,nod[Nod].max_right));
}
int main()
{
f >> N >> Q;
L = 1;
R = N;
Update(1,1,N,1);
for (int i = 1; i <= Q; ++i)
{
f >> op;
if (op == 3)
{
g << nod[1].lenght << '\n';
}
if (op == 1)
{
f >> L >> M;
R = L + M-1;
Update(1,1,N,0);
}
if (op == 2)
{
f >> L >> M;
R = L + M - 1;
Update(1,1,N,1);
}
}
f.close();
g.close();
return 0;
}