Cod sursa(job #1008204)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 10 octombrie 2013 16:52:23
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<cstdio>
#include<algorithm>
#define NMAX 100000+5
#define KMAX (1<<18)+5
using namespace std;
struct nod
{
    int lc,lst,ldr;
};
int N,P,K,Type,A,B;
nod AI[KMAX];
void adauga(int R,int lo,int hi)
{
    int md=(lo+hi)/2;
    if(A<=lo && hi<=B)
    {
        AI[R].lc=AI[R].lst=AI[R].ldr=0;
        return;
    }
    if(AI[R].lc==(hi-lo+1))
    {
        AI[2*R].lc=AI[2*R].lst=AI[2*R].ldr=(md-lo+1);
        AI[2*R+1].lc=AI[2*R+1].lst=AI[2*R+1].ldr=(hi-md);
    }
    if(A<=md) adauga(2*R,lo,md);
    if(md+1<=B) adauga(2*R+1,md+1,hi);
    AI[R].lc=max(AI[2*R].ldr+AI[2*R+1].lst,max(AI[2*R].lc,AI[2*R+1].lc));
    if(AI[2*R].lst==(md-lo+1)) AI[R].lst=(md-lo+1)+AI[2*R+1].lst;
    else AI[R].lst=AI[2*R].lst;
    if(AI[2*R+1].ldr==(hi-md)) AI[R].ldr=AI[2*R].ldr+(hi-md);
    else AI[R].ldr=AI[2*R+1].ldr;
}
void scoate(int R,int lo,int hi)
{
    int md=(lo+hi)/2;
    if(A<=lo && hi<=B)
    {
        AI[R].lc=AI[R].lst=AI[R].ldr=(hi-lo+1);
        return;
    }
    if(AI[R].lc==0) AI[2*R].lc=AI[2*R].lst=AI[2*R].ldr=AI[2*R+1].lc=AI[2*R+1].lst=AI[2*R+1].ldr=0;
    if(A<=md) scoate(2*R,lo,md);
    if(md+1<=B) scoate(2*R+1,md+1,hi);
    AI[R].lc=max(AI[2*R].ldr+AI[2*R+1].lst,max(AI[2*R].lc,AI[2*R+1].lc));
    if(AI[2*R].lst==(md-lo+1)) AI[R].lst=(md-lo+1)+AI[2*R+1].lst;
    else AI[R].lst=AI[2*R].lst;
    if(AI[2*R+1].ldr==(hi-md)) AI[R].ldr=AI[2*R].ldr+(hi-md);
    else AI[R].ldr=AI[2*R+1].ldr;
}
int main()
{
    int i,j,x;
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&N,&P);
    AI[1].lst=AI[1].ldr=AI[1].lc=N;
    for(;P;--P)
    {
        scanf("%d",&x);
        if(x==3)
        {
            printf("%d\n",AI[1].lc);
            continue;
        }
        scanf("%d%d",&A,&B); B+=A-1;
        if(x==1) adauga(1,1,N);
        else scoate(1,1,N);
        /*for(i=1,j=2;i<=2*K-1;i++)
        {
            printf("Nodul %d: %d in stanga, %d in dreapta, %d general\n",i,AI[i].lst,AI[i].ldr,AI[i].lc);
            if(i==j-1) {printf("\n"); j<<=1;}
        }
        printf("----------------\n\n");*/
    }
    return 0;
}