Cod sursa(job #1844550)

Utilizator mihnea00Duican Mihnea mihnea00 Data 10 ianuarie 2017 02:38:34
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>

using namespace std;

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

int v[400000],st[400000],cd,dr[400000],n,p,nr,poz,i,c;

void pune(int nod,int s,int d,int a,int b)
{
    if(a<=s && d<=b)
    {
        v[nod]=st[nod]=dr[nod]=0;
    }
    else
    {
        int mijlok=(s+d)/2;
        if(v[nod]==d-s+1)
        {
            v[nod*2]=st[nod*2]=dr[nod*2]=mijlok-s+1;
            v[nod*2+1]=st[nod*2+1]=dr[nod*2+1]=d-mijlok;
        }
        if(a<=mijlok)
            pune(nod*2,s,mijlok,a,b);
        if(mijlok<b)
            pune(nod*2+1,mijlok+1,d,a,b);
        v[nod]=max(v[nod*2],v[nod*2+1]);
        v[nod]=max(v[nod],dr[nod*2]+st[nod*2+1]);
        st[nod]=st[nod*2];
        if(st[nod]==mijlok-s+1)
            st[nod]+=st[nod*2+1];
        dr[nod]=dr[nod*2+1];
        if(dr[nod]==d-mijlok)
            dr[nod]+=dr[nod*2];
    }
}
void ia(int nod,int s,int d,int a,int b)
{
    if(a<=s && d<=b)
    {
        v[nod]=st[nod]=dr[nod]=d-s+1;
    }
    else
    {
        int mijlok=(s+d)/2;
        if(v[nod]==0)
        {
            v[nod*2]=st[nod*2]=dr[nod*2]=0;
            v[nod*2+1]=st[nod*2+1]=dr[nod*2+1]=0;
        }
        if(a<=mijlok)
            ia(nod*2,s,mijlok,a,b);
        if(mijlok<b)
            ia(nod*2+1,mijlok+1,d,a,b);
        v[nod]=max(v[nod*2],v[nod*2+1]);
        v[nod]=max(v[nod],dr[nod*2]+st[nod*2+1]);
        st[nod]=st[nod*2];
        if(st[nod]==mijlok-s+1)
            st[nod]+=st[nod*2+1];
        dr[nod]=dr[nod*2+1];
        if(dr[nod]==d-mijlok)
            dr[nod]+=dr[nod*2];
    }
}

int main()
{
    fin>>n>>p;
    v[1]=st[1]=dr[1]=n;
    for(i=1;i<=p;++i)
    {
        fin>>cd;
        if(cd==1)
        {
            fin>>poz>>nr;
            int da=poz+nr-1;
            pune(1,1,n,poz,da);
        }
        if(cd==2)
        {
            fin>>poz>>nr;
            int da=poz+nr-1;
            ia(1,1,n,poz,da);
        }
        if(cd==3)
            fout<<v[1]<<"\n";
    }

    return 0;
}