Cod sursa(job #1473197)

Utilizator mirupetPetcan Miruna mirupet Data 18 august 2015 20:00:29
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include<cstdio>
#define DIM (2 << 17)
using namespace std;

struct{int x, y, z;} arb[DIM];

int N, M, T, Val, start, finish, i;

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

void Update(int, int, int);

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

        scanf("%d%d", &N, &M);

        start = 1, finish = N;
        T = 2;
        Update(1, 1, N);


        for ( ; M; M--)
        {
            scanf("%d", &T);

            if (T == 3)
                printf("%d\n", arb[1].z);
            else
            {
                if (T == 1)
                {
                    scanf("%d%d", &start, &finish);
                    finish += start - 1;
                    Update(1, 1, N);
                }
                else
                {
                    scanf("%d%d", &start, &finish);
                    finish = finish + start - 1;
                    Update(1, 1, N);
                }

                /*for (i = 1; i <= N * 2 + 5; i++)
                    printf("%d ", arb[i].x);
                printf("\n");
                for (i = 1; i <= N * 2 + 5; i++)
                    printf("%d ", arb[i].y);
                printf("\n");
                for (i = 1; i <= N * 2 + 5; i++)
                    printf("%d ", arb[i].z);
                printf("\n\n");*/
            }
        }
    }

void Update(int nod, int left, int right)
{
    if (left > finish || right < start || left > right)
        return;

    if (start <= left && right <= finish)
    {
        if (T == 1)
            arb[nod].x = arb[nod].y = arb[nod].z = 0;
        else
            arb[nod].x = arb[nod].y = arb[nod].z = right - left + 1;
        return;
    }

    int div = (left + right)/2;

    if (arb[nod].z == 0)
    {
        arb[2 * nod].x = arb[2 * nod].y = arb[2 * nod].z = 0;
        arb[2 * nod + 1].x = arb[2 * nod + 1].y = arb[2 * nod + 1].z = 0;
    }
    else
        if (arb[nod].z == right - left + 1)
        {
            arb[2 * nod].x = arb[2 * nod].y = arb[2 * nod].z = div - left + 1;
            arb[2 * nod + 1].x = arb[2 * nod + 1].y = arb[2 * nod + 1].z = right - div;
        }

    Update(2 * nod, left, div);
    Update(2 * nod + 1, div + 1, right);

    arb[nod].x = arb[nod * 2].x;
    if (arb[nod * 2].y == div - left + 1)
            arb[nod].x += arb[nod * 2 + 1].x;

    arb[nod].y = arb[nod * 2 + 1].y;
    if (arb[2 * nod + 1].x == right - div)
        arb[nod].y += arb[2 * nod].y;

    arb[nod].z = Maxim(Maxim(arb[nod * 2 + 1].z, arb[nod * 2].z), arb[2 * nod].y + arb[2 * nod + 1].x);
}