Cod sursa(job #1877179)

Utilizator ClaudiuHHiticas Claudiu ClaudiuH Data 13 februarie 2017 01:37:03
Problema Hotel Scor 100
Compilator cpp Status done
Runda becreative11 Marime 1.94 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;
}