Cod sursa(job #1534178)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 23 noiembrie 2015 14:24:33
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#define N 131077

using namespace std;

int v1[4*N],x,y,v2[4*N],v3[4*N],n,m,op,i,cv2[4*N];

inline int mx(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 st,int dr,int op)
{
     int c=((x+y)>>1);

     if(cv2[nod]!=-1)
     {
         v1[2*nod]=cv2[nod]*(c-x+1);
         v2[2*nod]=cv2[nod]*(c-x+1);
         v3[2*nod]=cv2[nod]*(c-x+1);
         v1[2*nod+1]=cv2[nod]*(y-c);
         v2[2*nod+1]=cv2[nod]*(y-c);
         v3[2*nod+1]=cv2[nod]*(y-c);
         cv2[2*nod]=cv2[nod];
         cv2[2*nod+1]=cv2[nod];
         cv2[nod]=-1;
     }

     if(st<=x && y<=dr)
     {
         cv2[nod]=op;
         v1[nod]=op*(y-x+1);
         v2[nod]=op*(y-x+1);
         v3[nod]=op*(y-x+1);
         return;
     }
     if(c>=st) update(nod*2,x,c,st,dr,op);
     if(c<dr) update(nod*2+1,c+1,y,st,dr,op);
     v1[nod]=v1[2*nod]+v1[2*nod+1]*(v1[2*nod]==c-x+1);
     v3[nod]=v3[2*nod+1]+v3[2*nod]*(v3[2*nod+1]==y-c);
     v2[nod]=mx( v2[nod*2],v2[nod*2+1],v3[2*nod]+v1[2*nod+1] );
}

inline void build(int nod,int st,int dr,int poz)
{
    if(st==dr) {v1[nod]=v2[nod]=v3[nod]=1;cv2[nod]=-1;return;}
    int mij=(st+dr)>>1;
    if(mij>=poz) build(nod*2,st,mij,poz);
    else build(nod*2+1,mij+1,dr,poz);
    v1[nod]=v1[2*nod]+v1[2*nod+1]*(v1[2*nod]==mij-st+1);
    v3[nod]=v3[2*nod+1]+v3[2*nod]*(v3[2*nod+1]==dr-mij);
    v2[nod]=mx(v2[nod*2],v2[nod*2+1],v3[2*nod]+v1[2*nod+1] );
    cv2[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",&op);
        if(op==3)
        {
            printf("%d\n",v2[1]);
        }
        else
        {
           scanf("%d%d",&x,&y);
           y=x+y-1;
           update(1,1,n,x,y,op-1);
        }
    }
    return 0;
}