Cod sursa(job #1472806)

Utilizator Liviu98Dinca Liviu Liviu98 Data 17 august 2015 19:45:52
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <stdio.h>
#define NMax 100001
#define ArbMax 400001
using namespace std;
int S[ArbMax],D[ArbMax],M[ArbMax],N,x,y,op,Q;

void Update(int nod,int s,int d)
{
    if(x<=s && d<=y)
    {
        if(op==2)
            S[nod]=D[nod]=M[nod]=d-s+1;
        else S[nod]=D[nod]=M[nod]=0;
        return;
    }
    int mij=(s+d)/2;
    if(M[nod]==0)
    {
        S[nod*2]=M[nod*2]=D[nod*2]=0;
        S[nod*2+1]=M[nod*2+1]=D[nod*2+1]=0;
    }
    if(M[nod]==d-s+1)
    {
        S[nod*2]=M[nod*2]=D[nod*2]=mij-s+1;
        S[nod*2+1]=M[nod*2+1]=D[nod*2+1]=d-mij;
    }

    if(x<=mij)
        Update(nod*2,s,mij);
    if(y>mij)
        Update(2*nod+1,mij+1,d);

    if(S[nod*2]==mij-s+1)
        S[nod]=S[nod*2]+S[nod*2+1];
    else
        S[nod]=S[nod*2];

    if(D[nod*2+1]==d-mij)
        D[nod]=D[nod*2]+D[nod*2+1];
    else
        D[nod]=D[nod*2+1];

    M[nod]=max(max(M[nod*2],M[nod*2+1]),D[2*nod]+S[nod*2+1]);

}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&N,&Q);
    for(int i=1;i<=N;i++)
    {
        x=i;
        y=i;
        op=2;
        Update(1,1,N);
    }

    for(int i=1;i<=Q;i++)
    {
        scanf("%d",&op);
        if(op==3)
            printf("%d\n",M[1]);
        else
        {
            scanf("%d %d",&x,&y);
            y=x+y-1;
            Update(1,1,N);
        }
    }
}