Cod sursa(job #1844549)

Utilizator mihnea00Duican Mihnea mihnea00 Data 10 ianuarie 2017 02:36:37
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.75 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;
}

/*
#include<fstream>
using namespace std;

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

#define Max 100000

int sol[5*Max],n,start,end;
int sst[5*Max],sdr[5*Max];

void modi1(int,int,int);
void modi2(int,int,int);

int main()
{
    int t,k;
    fin>>n>>t;
    sol[1]=sst[1]=sdr[1]=n;
    while(t--)
    {
        fin>>k;
        if(k<3)
        {
            fin>>start>>end;
            end=start+end-1;
            if(k==1) modi1(1,1,n);
            else modi2(1,1,n);
        }
        else fout<<sol[1]<<'\n';
    }
    return 0;
}

void modi1(int k,int i,int j)
{
    if(start<=i&&j<=end)
    {
        sol[k]=sst[k]=sdr[k]=0;
        return;
    }
    int mij=(i+j)/2;
    if(sol[k]==j-i+1)
    {
        sol[2*k]=sst[2*k]=sdr[2*k]=mij-i+1;
        sol[2*k+1]=sst[2*k+1]=sdr[2*k+1]=j-mij;
    }
    if(start<=mij) modi1(2*k,i,mij);
    if(mij<end) modi1(2*k+1,mij+1,j);
    sol[k]=max(sol[2*k],sol[2*k+1]);
    sol[k]=max(sol[k],sdr[2*k]+sst[2*k+1]);
    sst[k]=sst[2*k];
    if(mij-i+1==sst[2*k])
        sst[k]+=sst[2*k+1];
    sdr[k]=sdr[2*k+1];
    if(j-mij==sdr[2*k+1])
        sdr[k]+=sdr[2*k];
}

void modi2(int k,int i,int j)
{
    if(start<=i&&j<=end)
    {
        sol[k]=sst[k]=sdr[k]=j-i+1;
        return;
    }
    if(sol[k]==0)
    {
        sol[2*k]=sst[2*k]=sdr[2*k]=0;
        sol[2*k+1]=sst[2*k+1]=sdr[2*k+1]=0;
    }
    int mij=(i+j)/2;
    if(start<=mij) modi2(2*k,i,mij);
    if(mij<end) modi2(2*k+1,mij+1,j);
    sol[k]=max(sol[2*k],sol[2*k+1]);
    sol[k]=max(sol[k],sdr[2*k]+sst[2*k+1]);
    sst[k]=sst[2*k];
    if(mij-i+1==sst[2*k])
        sst[k]+=sst[2*k+1];
    sdr[k]=sdr[2*k+1];
    if(j-mij==sdr[2*k+1])
        sdr[k]+=sdr[2*k];
}*/