Cod sursa(job #655148)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 1 ianuarie 2012 15:13:35
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <algorithm>

#define NMax 500005

using namespace std;

struct ArbInt
{
    int L, R, M, V;
    int Length;
};

ArbInt AI[NMax];
int N;

inline void Build (int K, int L, int R)
{
    int Mid=(L+R)/2;
    AI[K].L=AI[K].R=AI[K].M=AI[K].Length=R-L+1;
    AI[K].V=-1;
    if (L<R)
    {
        Build (2*K, L, Mid);
        Build (2*K+1, Mid+1, R);
    }
}

inline void Update (int K, int L, int R, int UL, int UR, int V)
{
    int Mid=(L+R)/2;
    if (UL<=L and R<=UR)
    {
        AI[K].L=AI[K].R=AI[K].R=AI[K].Length*V;
        AI[K].V=V;
        return;
    }
    if (AI[K].V!=-1)
    {
        Update (2*K, L, Mid, L, Mid, AI[K].V);
        Update (2*K+1, Mid+1, R, Mid+1, R, AI[K].V);
        AI[K].V=-1;
    }
    if (UL<=Mid)
    {
        Update (2*K, L, Mid, UL, UR, V);
    }
    if (UR>Mid)
    {
        Update (2*K+1, Mid+1, R, UL, UR, V);
    }
    AI[K].M=max (max (AI[2*K].M, AI[2*K+1].M), AI[2*K].R+AI[2*K+1].L);
    AI[K].L=AI[2*K].L;
    if (AI[2*K].L==AI[2*K].Length)
    {
        AI[K].L+=AI[2*K+1].L;
    }
    AI[K].R=AI[2*K+1].R;
    if (AI[2*K+1].R==AI[2*K+1].Length)
    {
        AI[K].R+=AI[2*K].R;
    }
}

int main()
{
    freopen ("hotel.in", "r", stdin);
    freopen ("hotel.out", "w", stdout);
    int NQ;
    scanf ("%d %d", &N, &NQ);
    Build (1, 1, N);
    for (; NQ>0; --NQ)
    {
        int Type, X, Y;
        scanf ("%d", &Type);
        if (Type==3)
        {
            printf ("%d\n", AI[1].M);
            continue;
        }
        scanf ("%d %d", &X, &Y);
        Update (1, 1, N, X, X+Y-1, 1-Type%2);
    }
    return 0;
}