Cod sursa(job #1017213)

Utilizator cat_red20Vasile Ioana cat_red20 Data 27 octombrie 2013 15:24:08
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#define MAXN 1<<18
using namespace std;
int n,p,sleft[MAXN],sright[MAXN],s[MAXN],x,y,val;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

void update(int nod,int st,int dr)
{
    if(x<=st && dr<=y)
    {
        s[nod]=sleft[nod]=sright[nod]=(dr-st+1)*val;
        return;
    }
    int m=(st+dr)/2;
    //lazy
    if(s[nod]==0)
    {
        s[2*nod]=sleft[2*nod]=sright[2*nod]=0;
        s[2*nod+1]=sleft[2*nod+1]=sright[2*nod+1]=0;
    }
    if(s[nod]==(dr-st+1))
    {
        s[2*nod]=sleft[2*nod]=sright[2*nod]=m-st+1;
        s[2*nod+1]=sleft[2*nod+1]=sright[2*nod+1]=dr-m;
    }
    if(x<=m)
        update(2*nod,st,m);
    if(y>m)
        update(2*nod+1,m+1,dr);
    s[nod]=max(sright[2*nod]+sleft[2*nod+1],max(s[2*nod],s[2*nod+1]));
    sleft[nod]=sleft[2*nod];
    if(sleft[2*nod]==m-st+1)
        sleft[nod]+=sleft[2*nod+1];
    sright[nod]=sright[2*nod+1];
    if(sright[2*nod+1]==dr-m)
        sright[nod]+=sright[2*nod];
}

int main()
{
    int a;
    fin>>n>>p;
    s[1]=sleft[1]=sright[1]=n;
    for(int i=1;i<=p;i++)
    {
        fin>>a;
        switch(a)
        {
        case 1:
            fin>>x>>y;
            y+=x-1;
            val=0;
            update(1,1,n);
            break;
        case 2:
            fin>>x>>y;
            y+=x-1;
            val=1;
            update(1,1,n);
            break;
        case 3:
            fout<<s[1]<<"\n";
        }
    }
    return 0;
}