Pagini recente » Cod sursa (job #522266) | Cod sursa (job #3269400) | Cod sursa (job #2346276) | Cod sursa (job #553038) | Cod sursa (job #316006)
Cod sursa(job #316006)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct nod { int st, dr, t;
};
vector<nod> arb(300003);
vector<int> x(100001),y(100001);
int n;
void build(int k,int st, int dr)
{
int m=(st+dr)/2,l=2*k;
arb[k].st=arb[k].dr=arb[k].t=dr-st+1;
if (st<dr)
{
build(l,st,m);
build(l+1,m+1,dr);
}
}
void update(int k,int st,int dr,int i,int j,int op)
// daca op=1 se ocupa camerele din intervalul i...j
// daca op=2 se elibereaza camerele din intervalul i...j
// modificarea se face pt. intervalul st...dr din arbore.
{
int l=2*k,m=(st+dr)/2;
if (i<=st && j>=dr) // toate camerele din intervalul curent sunt ocupate sau eliberate
{
if (op==2)
arb[k].t=arb[k].st=arb[k].dr=dr-st+1;
else
arb[k].t=arb[k].st=arb[k].dr=0;
return;
}
// daca toate camerele erau in starea opusa (ocupate sau libere)
// transferam proprietatea nodurilor fii adica
// (st,dr) tot liber inseamna ca (st,m) liber si (m+1,dr) liber
// si updatam pe urma aceste subintervale
if (arb[k].t==dr-st+1)
{
arb[l].t=arb[l].st=arb[l].dr=m-st+1;
arb[l+1].t=arb[l+1].st=arb[l+1].dr=dr-m;
}
else
if (arb[k].t==0)
{
arb[l].t=arb[l].st=arb[l].dr=0;
arb[l+1].t=arb[l+1].st=arb[l+1].dr=0;
}
if (i<=m)
update(l,st,m,i,j,op);
if (j>m)
update(l+1,m+1,dr,i,j,op);
arb[k].t=max(arb[l].t,arb[l].dr+arb[l+1].st);
arb[k].t=max(arb[k].t,arb[l+1].t);
if (arb[l].t==m-st+1)
arb[k].st=arb[l].t+arb[l+1].st;
else
arb[k].st=arb[l].st;
if (arb[l+1].t==dr-m)
arb[k].dr=arb[l].dr+arb[l+1].t;
else
arb[k].dr=arb[l+1].dr;
}
int main()
{
int i,p,op,s,nr;
f>>n>>p;
build(1,1,n);
for (i=1;i<=p;i++)
{
f>>op;
if (op==3)
g<<arb[1].t<<"\n";
else
{
f>>s>>nr;
update(1,1,n,s,s+nr-1,op);
}
}
g.close();
f.close();
return 0;
}