Cod sursa(job #1204273)

Utilizator pentrusandaPentru Sanda pentrusanda Data 2 iulie 2014 15:54:12
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.51 kb
#include <fstream>
#include <iostream>

using namespace std;

struct nod
{
    int inc,sf,tot,timp,tip;
} adi[400005];

int n,p,x,y,z,i,asd;

void ocupa(int st,int dr,int nod)
{
    if(x<=st && dr<=y)
    {
        adi[nod].inc=0;
        adi[nod].sf=0;
        adi[nod].tot=0;
        adi[nod].timp=i;
        adi[nod].tip=1;
    }else
    {
        int m=(st+dr)/2;
                if (adi[nod*2+1].timp<adi[nod].timp)
                {
                    if (adi[nod].tip==1) { adi[nod*2+1]=adi[nod]; }
                    else
                        {
                            adi[nod*2+1].inc=dr-m;
                            adi[nod*2+1].sf=dr-m;
                            adi[nod*2+1].timp=adi[nod].timp;
                            adi[nod*2+1].tip=2;
                            adi[nod*2+1].tot=dr-m;
                        }
                }
                if (adi[nod*2].timp<adi[nod].timp)
                {
                    if (adi[nod].tip==1) { adi[nod*2]=adi[nod]; }
                    else
                        {
                            adi[nod*2].inc=m-st+1;
                            adi[nod*2].sf=m-st+1;
                            adi[nod*2].timp=adi[nod].timp;
                            adi[nod*2].tip=2;
                            adi[nod*2].tot=m-st+1;
                        }
                }
        if (x<=m)
            {
                ocupa(st,m,2*nod);
            }
        if (y>m)
        {
            ocupa(m+1,dr,2*nod+1);
        }
        adi[nod].inc=adi[nod*2].inc; if (m-st+1==adi[nod*2].inc) adi[nod].inc+=adi[nod*2+1].inc;
        adi[nod].sf=adi[nod*2+1].sf; if (dr-m==adi[nod*2+1].sf) adi[nod].sf+=adi[nod*2].sf;
        adi[nod].tot=adi[nod*2].tot; if (adi[nod*2+1].tot>adi[nod].tot) adi[nod].tot=adi[nod*2+1].tot; if (adi[nod*2].sf+adi[nod*2+1].inc>adi[nod].tot) adi[nod].tot=adi[nod*2].sf+adi[nod*2+1].inc;
    }
}

void elibereaza(int st,int dr,int nod)
{
    if(x<=st && dr<=y)
    {
        adi[nod].inc=dr-st+1;
        adi[nod].sf=dr-st+1;
        adi[nod].tot=dr-st+1;
        adi[nod].timp=i;
        adi[nod].tip=2;
    }else
    {
        int m=(st+dr)/2;
                if (adi[nod*2+1].timp<adi[nod].timp)
                {
                    if (adi[nod].tip==1) { adi[nod*2+1]=adi[nod]; }
                    else
                        {
                            adi[nod*2+1].inc=dr-m;
                            adi[nod*2+1].sf=dr-m;
                            adi[nod*2+1].timp=adi[nod].timp;
                            adi[nod*2+1].tip=2;
                            adi[nod*2+1].tot=dr-m;
                        }
                }

                if (adi[nod*2].timp<adi[nod].timp)
                {
                    if (adi[nod].tip==1) { adi[nod*2]=adi[nod]; }
                    else
                        {
                            adi[nod*2].inc=m-st+1;
                            adi[nod*2].sf=m-st+1;
                            adi[nod*2].timp=adi[nod].timp;
                            adi[nod*2].tip=2;
                            adi[nod*2].tot=m-st+1;
                        }
                }
        if (x<=m)
            {
                elibereaza(st,m,2*nod);
            }
        if (y>m)
        {
            elibereaza(m+1,dr,2*nod+1);
        }
        adi[nod].inc=adi[nod*2].inc; if (m-st+1==adi[nod*2].inc) adi[nod].inc+=adi[nod*2+1].inc;
        adi[nod].sf=adi[nod*2+1].sf; if (dr-m==adi[nod*2+1].sf) adi[nod].sf+=adi[nod*2].sf;
        adi[nod].tot=adi[nod*2].tot; if (adi[nod*2+1].tot>adi[nod].tot) adi[nod].tot=adi[nod*2+1].tot; if (adi[nod*2].sf+adi[nod*2+1].inc>adi[nod].tot) adi[nod].tot=adi[nod*2].sf+adi[nod*2+1].inc;
    }
}

void initiaza(int st,int dr,int nod)
{
    adi[nod].inc=dr-st+1;
    adi[nod].sf=dr-st+1;
    adi[nod].tot=dr-st+1;
    adi[nod].tip=2;
    adi[nod].timp=0;
    if (st!=dr)
    {
        int m=(st+dr)/2;
        initiaza(st,m,nod*2);
        initiaza(m+1,dr,nod*2+1);
    }
}

int main()
{
    ifstream in ("hotel.in");
    ofstream out ("hotel.out");

    in>>n>>p;

    i=0;
    initiaza(1,n,1);
    for ( i=1;i<=p;++i)
    {
        in>>x;
        if (x==1)
        {
            in>>x>>z;
            y=x+z-1;
            ocupa(1,n,1);
        }else if (x==2)
        {
            in>>x>>z;
            y=x+z-1;
            elibereaza(1,n,1);
        }else
        {
            out<<adi[1].tot<<"\n";
        }
    }

    in.close();
    out.close();
    return 0;
}