Cod sursa(job #1206914)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 11 iulie 2014 15:03:26
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include<fstream>
using namespace std;

struct cell
{
    int dr,st;
    int best;
    int ok;
};

ifstream fin("hotel.in");
ofstream fout("hotel.out");

const int NMAX=100005;

int n,p;
cell aint[8*NMAX];

inline void CreateAint(int nod,int stanga,int dreapta)
{
    if (stanga==dreapta)
        aint[nod].best=aint[nod].st=aint[nod].dr=dreapta-stanga+1;
    else
        {
            int mij=(stanga+dreapta)>>1;
            CreateAint(2*nod,stanga,mij);
            CreateAint(2*nod+1,mij+1,dreapta);
            aint[nod].best=aint[nod].st=aint[nod].dr=dreapta-stanga+1;
        }
}

inline void DOWN(int poz,int dreapta,int stanga)
{
    if (aint[poz].ok==1) {aint[poz].best=aint[poz].st=aint[poz].dr=0;aint[2*poz].ok=aint[2*poz+1].ok=1;}
    if (aint[poz].ok==0) {aint[poz].best=aint[poz].st=aint[poz].dr=dreapta-stanga+1;aint[2*poz].ok=aint[2*poz+1].ok=0;}
}

inline void UPDATE(int nod,int stanga,int dreapta,int a,int b,int c)
{
    if (a<=stanga && dreapta<=b)
        {
            //fout<<"stanga="<<stanga<<" "<<"dreapta="<<nod<<"\n";
            if (c==1)
                {aint[nod].ok=1;aint[nod].best=aint[nod].st=aint[nod].dr=0;}
            else
                {aint[nod].ok=0;aint[nod].best=aint[nod].st=aint[nod].dr=dreapta-stanga+1;}
        }
    else
        {
            int mij=(stanga+dreapta)>>1;
            DOWN(nod,dreapta,stanga);

            if (a<=mij) UPDATE(2*nod,stanga,mij,a,b,c);
            if (b>mij) UPDATE(2*nod+1,mij+1,dreapta,a,b,c);

            DOWN(2*nod,mij,stanga);
            DOWN(2*nod+1,dreapta,mij+1);

            aint[nod].dr=aint[2*nod+1].dr;
            if (aint[2*nod+1].best==dreapta-mij) aint[nod].dr+=aint[2*nod].dr;
            aint[nod].st=aint[2*nod].st;
            if (aint[2*nod].best==mij-stanga+1) aint[nod].st+=aint[2*nod+1].st;

            aint[nod].best=max(aint[2*nod].best,max(aint[2*nod+1].best,aint[2*nod].dr+aint[2*nod+1].st));

            aint[nod].ok=2;
            if (aint[nod].best==0) aint[nod].ok=1;
            if (aint[nod].best==dreapta-stanga+1) aint[nod].ok=0;
        }
}


inline int QUERY(int nod,int stanga,int dreapta)
{
    return aint[nod].best;
}

inline void SOLVE()
{
    int i,c,poz,m;
    for (i=1;i<=p;i++)
        {
           fin>>c;
           if (c!=3) {fin>>poz>>m;UPDATE(1,1,n,poz,poz+m-1,c);}
           else fout<<QUERY(1,1,n)<<"\n";
        }
}

int main()
{
    fin>>n>>p;
    CreateAint(1,1,n);
    SOLVE();
   // for (int i=1;i<=30;i++) fout<<aint[i].st<<" "<<aint[i].best<<" "<<aint[i].dr<<" "<<aint[i].ok<<"\n";
    return 0;
}