Pagini recente » Cod sursa (job #2214464) | Cod sursa (job #1736797) | Cod sursa (job #1475192) | Cod sursa (job #415744) | Cod sursa (job #2454725)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
const int dim = 100005;
struct aint
{
int maxi,pref,suf;
};
int n,q;
aint arb[4*dim];
int a,b;
int liber = 0;
void ocupa(int nod,int st,int dr)
{
if (liber)
{
arb[nod].maxi = arb[nod].pref = arb[nod].suf = dr-st+1;
}
if (a <= st && dr <= b)
{
arb[nod].maxi = arb[nod].pref = arb[nod].suf = 0;
return ;
}
if (dr < a || st > b)
{
return ;
}
int mid = (st+dr)/2;
if (arb[nod].maxi == dr-st+1 && liber == 0)
{
liber = 1;
ocupa(2*nod,st,mid);
ocupa(2*nod+1,mid+1,dr);
liber = 0;
}
else
{
ocupa(2*nod,st,mid);
ocupa(2*nod+1,mid+1,dr);
}
arb[nod].maxi = max(max(arb[2*nod].maxi , arb[2*nod+1].maxi) , arb[2*nod].suf + arb[2*nod+1].pref);
if (arb[2*nod].pref == mid-st+1)
{
arb[nod].pref = arb[2*nod].pref + arb[2*nod+1].pref;
}
else arb[nod].pref = arb[2*nod].pref;
if (arb[2*nod+1].suf == dr-mid)
{
arb[nod].suf = arb[2*nod+1].suf + arb[2*nod].suf;
}
else arb[nod].suf = arb[2*nod+1].suf;
}
int ocupat = 0;
void elibereaza(int nod,int st,int dr)
{
if (ocupat)
{
arb[nod].maxi = arb[nod].pref = arb[nod].suf = 0;
}
if (a <= st && dr <= b)
{
arb[nod].maxi = arb[nod].pref = arb[nod].suf = dr-st+1;
return ;
}
if (dr < a || st > b)
{
return ;
}
int mid = (st+dr)/2;
if (arb[nod].maxi == 0 && ocupat == 0)
{
ocupat = 1;
elibereaza(2*nod,st,mid);
elibereaza(2*nod+1,mid+1,dr);
ocupat = 0;
}
else
{
elibereaza(2*nod,st,mid);
elibereaza(2*nod+1,mid+1,dr);
}
arb[nod].maxi = max(max(arb[2*nod].maxi , arb[2*nod+1].maxi) , arb[2*nod].suf + arb[2*nod+1].pref);
if (arb[2*nod].pref == mid-st+1)
{
arb[nod].pref = arb[2*nod].pref + arb[2*nod+1].pref;
}
else arb[nod].pref = arb[2*nod].pref;
if (arb[2*nod+1].suf == dr-mid)
{
arb[nod].suf = arb[2*nod+1].suf + arb[2*nod].suf;
}
else arb[nod].suf = arb[2*nod+1].suf;
}
int main()
{
int op;
in >> n >> q;
arb[1].maxi = arb[1].pref = arb[1].suf = n;
for (int i=1; i<=q; i++)
{
in >> op;
if (op == 1)
{
liber = 0;
in >> a >> b;
b = a + b - 1;
ocupa(1,1,n);
}
if (op == 2)
{
ocupat = 0;
in >> a >> b;
b = a + b - 1;
elibereaza(1,1,n);
}
if (op == 3)
{
out << arb[1].maxi << "\n";
}
}
return 0;
}