Cod sursa(job #1008712)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 11 octombrie 2013 18:00:15
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct SegmentTree {int Left,Right,Best;};
SegmentTree A[(1<<18)+1];
int N,M,O,X,Y;

void Init(int Node,int Val)
{
    A[Node].Left=A[Node].Right=A[Node].Best=Val;
}

void Update(int Node,int L,int R,int Val)
{
    if(L>=X && R<=Y)
    {
        if(Val) Init(Node,0);
        else Init(Node,R-L+1);
        return;
    }

    int M=(L+R)/2;
    int LS=2*Node;
    int RS=2*Node+1;

    if(A[Node].Best==R-L+1)
    {
        Init(LS,M-L+1);
        Init(RS,R-M);
    }
    else if(A[Node].Best==0)
    {
        Init(LS,0);
        Init(RS,0);
    }

    if(X<=M) Update(LS,L,M,Val);
    if(Y>M) Update(RS,M+1,R,Val);

    A[Node].Left=A[LS].Left;
    if(A[LS].Left==M-L+1) A[Node].Left+=A[RS].Left;

    A[Node].Right=A[RS].Right;
    if(A[RS].Right==R-M) A[Node].Right+=A[LS].Right;

    A[Node].Best=max(A[LS].Right+A[RS].Left,max(A[LS].Best,A[RS].Best));
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&N,&M);
    A[1].Left=A[1].Right=A[1].Best=N;
    for(;M;M--)
    {
        scanf("%d",&O);
        if(O==1)
        {
            scanf("%d%d",&X,&Y);
            Y=X+Y-1; Update(1,1,N,1);
        }
        else if(O==2)
        {
            scanf("%d%d",&X,&Y);
            Y=X+Y-1; Update(1,1,N,0);
        }
        else printf("%d\n",A[1].Best);
    }
    return 0;
}