Cod sursa(job #1513738)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 29 octombrie 2015 21:53:49
Problema Hotel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <cstdio>
#define N 100015

using namespace std;

int A[4*N],x,y,B[4*N],C[4*N],n,m,tip,i,cb[4*N];

inline int maxim(int x,int y,int z)
{
   if(x>=y && x>=z) return x;
   if(y>=x && y>=z) return y;
   return z;
}
inline void Update(int nod,int x,int y,int lu,int ru,int tip)
{
     int c=((x+y)>>1);

     if(cb[nod]!=-1)
     {
         A[2*nod]=cb[nod]*(c-x+1);
         B[2*nod]=cb[nod]*(c-x+1);
         C[2*nod]=cb[nod]*(c-x+1);

         A[2*nod+1]=cb[nod]*(y-c);
         B[2*nod+1]=cb[nod]*(y-c);
         C[2*nod+1]=cb[nod]*(y-c);

         cb[2*nod]=cb[nod];
         cb[2*nod+1]=cb[nod];
         cb[nod]=-1;
     }

     if(lu<=x && y<=ru)
     {
         cb[nod]=tip;
         A[nod]=tip*(y-x+1);
         B[nod]=tip*(y-x+1);
         C[nod]=tip*(y-x+1);
         return;
     }

     if(c>=lu) Update(nod*2,x,c,lu,ru,tip);
     if(c<ru) Update(nod*2+1,c+1,y,lu,ru,tip);

     A[nod]= A[2*nod]+ A[2*nod+1]*(A[2*nod]==c-x+1);
     C[nod]= C[2*nod+1]+ C[2*nod]*(C[2*nod+1]==y-c);
     B[nod]=maxim( B[nod*2], B[nod*2+1], C[2*nod]+A[2*nod+1] );
}

inline void build(int nod,int x,int y,int poz)
{
    if(x==y) {A[nod]=B[nod]=C[nod]=1;cb[nod]=-1;return;}

    int c=((x+y)>>1);
    if(c>=poz) build(nod*2,x,c,poz);
    else build(nod*2+1,c+1,y,poz);

    A[nod]= A[2*nod]+ A[2*nod+1]*(A[2*nod]==c-x+1);
    C[nod]= C[2*nod+1]+ C[2*nod]*(C[2*nod+1]==y-c);
    B[nod]=maxim( B[nod*2], B[nod*2+1], C[2*nod]+A[2*nod+1] );
    cb[nod]=-1;
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;++i)
    build(1,1,n,i);

    for(i=1;i<=m;++i)
    {
        scanf("%d",&tip);
        if(tip==3) printf("%d\n",B[1]);
        else
        {
           scanf("%d%d",&x,&y);y=x+y-1;
           Update(1,1,n,x,y, tip-1);
        }
    }
    return 0;
}