Cod sursa(job #1418147)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 11 aprilie 2015 23:54:22
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <cstdio>
#include <algorithm>

#define left (2*node)
#define right (2*node+1)

#define gol first
#define l second.first
#define r second.second

#define Nmax 100010

using namespace std;

pair < int , pair < int , int > > hotel[3*Nmax];

int N , Q , i , tip , st , dr;

void update(int node , int begin , int end , int st , int dr , int mod , int q)
{
    if (st <= begin && end <= dr)
    {
        if (mod == 1) hotel[node].l = hotel[node].r = hotel[node].gol = 0;
        else hotel[node].l = hotel[node].r = hotel[node].gol = end - begin + 1;

        if (q) return;
    }

    int mid = (begin + end) >> 1;

    if (hotel[node].gol == 0 && q)
        hotel[left].l = hotel[left].r = hotel[left].gol = 0,
        hotel[right].l = hotel[right].r = hotel[right].gol = 0;
    else if (hotel[node].gol == end - begin + 1 && q)
        hotel[left].l = hotel[left].r = hotel[left].gol = mid - begin + 1,
        hotel[right].l = hotel[right].r = hotel[right].gol = end - mid;


    if (begin == end && !q) return;

    if (st <= mid) update(left , begin , mid , st , dr , mod , q);
    if (mid < dr) update(right , mid + 1 , end , st , dr , mod , q);

    if (hotel[left].l == mid - begin + 1) hotel[node].l = hotel[left].l + hotel[right].l;
    else hotel[node].l = hotel[left].l;

    if (hotel[right].r == end - mid) hotel[node].r = hotel[right].r + hotel[left].r;
    else hotel[node].r = hotel[right].r;

    hotel[node].gol = max(max(hotel[left].gol , hotel[right].gol) , hotel[left].r + hotel[right].l);
}

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

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

    update(1 , 1 , N , 1 , N , 0 , 0);

    for (i = 1; i <= Q; ++i)
    {
        scanf("%d", &tip);

        if (tip == 1)
        {
            scanf("%d %d", &st, &dr); dr = st + dr - 1;
            update(1 , 1 , N , st , dr , 1 , 1);
        }
        else if (tip == 2)
        {
            scanf("%d %d", &st, &dr); dr = st + dr - 1;
            update(1 , 1 , N , st , dr , 0 , 1);
        }
        else printf("%d\n", hotel[1].gol);
    }

    return 0;
}