Cod sursa(job #1060660)

Utilizator Tudordmdaniel marin Tudordm Data 18 decembrie 2013 12:35:06
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include<stdio.h>

int t,n,sti,dri;

struct arbore{
    int prefix,sufix,secvmax;
} arb[1<<25];

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

int maxim(int a, int b, int c)
{
    int h=max(b,c);
    return a> h ? a :h;
}

bool liber,plin;

void ocup(int p, int st, int dr){
    if(liber){
        arb[p].secvmax =arb[p].prefix = arb[p].sufix = dr-st+1;
    }
    if(sti <= st && dr <= dri){
        arb[p].secvmax = arb[p].prefix = arb[p].sufix = 0;
        return;
    }
    if(dr < sti || st > dri){
        return;
    }
    if(arb[p].secvmax == dr-st+1 && !liber){
        liber = true;
        ocup(2*p, st, (st+dr)/2);
        ocup(2*p+1,(st+dr)/2+1, dr);
        liber = false;
    } else {
        ocup(2*p,st, (st+dr)/2);
        ocup(2*p+1,(st+dr)/2+1, dr);
      }
    arb[p].secvmax = maxim(arb[2*p].secvmax, arb[2*p+1].secvmax, arb[2*p].sufix+arb[2*p+1].prefix);
    if(arb[2*p].prefix == (st+dr)/2-st+1){
        arb[p].prefix = arb[2*p].prefix + arb[2*p+1].prefix;
    } else {
        arb[p].prefix = arb[2*p].prefix;
    }
    if(arb[2*p+1].sufix==dr-(st+dr)/2){
        arb[p].sufix=arb[2*p].sufix+arb[2*p+1].sufix;
    } else{
        arb[p].sufix=arb[2*p+1].sufix;
    }
}

void empty(int p, int st, int dr){
    if(plin){
        arb[p].secvmax = arb[p].prefix = arb[p].sufix = 0;
    }
    if(sti <= st && dr <= dri){
        arb[p].secvmax = arb[p].prefix = arb[p].sufix = dr-st+1;
        return;
    }
    if(dr < sti || st > dri){
        return;
    }
    if(arb[p].secvmax == plin && !plin){
        plin = true;
        empty(2*p, st, (st+dr)/2);
        empty(2*p+1,(st+dr)/2+1, dr);
        plin = false;
    } else {
        empty(2*p,st, (st+dr)/2);
        empty(2*p+1,(st+dr)/2+1, dr);
      }
    arb[p].secvmax = maxim(arb[2*p].secvmax, arb[2*p+1].secvmax, arb[2*p].sufix+arb[2*p+1].prefix);
    if(arb[2*p].prefix == (st+dr)/2-st+1){
        arb[p].prefix = arb[2*p].prefix + arb[2*p+1].prefix;
    } else {
        arb[p].prefix = arb[2*p].prefix;
    }
    if(arb[2*p+1].sufix==dr-(st+dr)/2){
        arb[p].sufix=arb[2*p].sufix+arb[2*p+1].sufix;
    } else{
        arb[p].sufix=arb[2*p+1].sufix;
    }
}

int main(){

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

    int tip,a,b;
    scanf("%d%d",&n,&t);

    arb[1].secvmax=arb[1].prefix= arb[1].sufix=n;

    for(int i=1; i<=t; i++)
    {
        scanf("%d",&tip);
        if(tip==1)
        {
            scanf("%d%d",&a,&b);
            ocup(a,a+b-1);
        }
        if(tip==2)
        {
            scanf("%d%d",&a,&b);
            empty(a,a+b-1);
        }
        if(tip==3)
        {
            printf("%d\n",arb[1].secvmax);
        }
    }
    return 0;
}