Cod sursa(job #1076748)

Utilizator usermeBogdan Cretu userme Data 10 ianuarie 2014 15:37:41
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<stdio.h>
struct arbore
{
    int max,st,dr;
};
int n,nrq,x,y;
arbore v[1<<18];

inline int max(int a, int b){return a>b?a:b;}

void update(int nod, int st, int dr, int t)
{
    int m=(st+dr)>>1,left=(nod<<1),right=left|1;
    if(t==1)
    {
        if(x<=st && dr<=y)
        {
            v[nod].max=v[nod].st=v[nod].dr=0;
            return;
        }
        if(v[nod].max==dr-st+1)
        {
            v[left].max=v[left].st=v[left].dr=m-st+1;
            v[right].max=v[right].st=v[right].dr=dr-m;
        }
    }
    else
    {
        if(x<=st && dr<=y)
        {
            v[nod].max=v[nod].st=v[nod].dr=dr-st+1;
            return;
        }
        if(v[nod].max==0)
        {
            v[left].max=v[left].st=v[left].dr=0;
            v[right].max=v[right].st=v[right].dr=0;
        }
    }

    if(x<=m)
        update(left,st,m,t);
    if(m<y)
        update(right,m+1,dr,t);

    v[nod].max=max(v[left].max,v[right].max);
    v[nod].max=max(v[nod].max,v[left].dr+v[right].st);

    v[nod].st=v[left].st;
    if(v[left].max==m-st+1)
        v[nod].st=v[left].max+v[right].st;

    v[nod].dr=v[right].dr;
    if(v[right].dr==dr-m)
        v[nod].dr=v[right].max+v[left].dr;
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&n,&nrq);
    x=1;
    y=n;
    update(1,1,n,2);
    int i,t;
    for(i=1;i<=nrq;i++)
    {
        scanf("%d",&t);
        if(t==3)
            printf("%d\n",v[1].max);
        else
        {
            scanf("%d%d",&x,&y);
            y=y+x-1;
            update(1,1,n,t);
        }
    }
    return 0;
}