Cod sursa(job #1759908)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 19 septembrie 2016 23:35:15
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

struct segmentTree{

    int current;
    int left_INT;
    int right_INT;

}AINT[5 * 100010];

int N, M, i, question, P;



void build(int node, int left, int right)
{
    if(left == right)
    {
        AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = 1;
        return;
    }

    int middle = (left + right) >> 1;

    build(2 * node, left, middle);
    build(2 * node + 1, middle + 1, right);

    AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = AINT[2 * node].current +  AINT[2 * node + 1].current;
}

void update(int node, int left, int right, int A, int B, int value)
{
    if(left >= A && right <= B)
    {
        if(value == 1)
        {
            AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = 0;
        }
        else
        {
            AINT[node].current = AINT[node].left_INT = AINT[node].right_INT = right - left + 1;
        }
        return;
    }

    int middle = (left + right) >> 1;

    if(AINT[node].current == 0)
    {
        AINT[2 * node].current = AINT[2 * node].left_INT = AINT[2 * node].right_INT = 0;
        AINT[2 * node + 1].current = AINT[2 * node + 1].left_INT = AINT[2 * node + 1].right_INT = 0;
    }

    if(AINT[node].current == right - left + 1)
    {
        AINT[2 * node].current = AINT[2 * node].left_INT = AINT[2 * node].right_INT = middle - left + 1;
        AINT[2 * node + 1].current = AINT[2 * node + 1].left_INT = AINT[2 * node + 1].right_INT = right - middle;
    }

    if(A <= middle)
    {
        update(2 * node, left, middle, A, B, value);
    }
    if(B > middle)
    {
        update(2 * node + 1, middle + 1, right, A, B, value);
    }

    AINT[node].current = max( max(AINT[2 * node].current, AINT[2 * node + 1].current), AINT[2 * node].right_INT + AINT[2 * node + 1].left_INT );
    AINT[node].left_INT = AINT[2 * node].left_INT;
    AINT[node].right_INT = AINT[2 * node + 1].right_INT;

    if(AINT[2 * node].left_INT == middle - left + 1)
    {
        AINT[node].left_INT += AINT[2 * node + 1].left_INT;
    }
    if(AINT[2 * node + 1].right_INT == right - middle)
    {
        AINT[node].right_INT += AINT[2 * node].right_INT;
    }
}


int main()
{
    fin >> N >> P;

    build(1, 1, N);

    while(P --)
    {
        fin >> question;

        if(question == 1)
        {
            fin >> i >> M;
            update(1, 1, N, i, i + M - 1, 1); // 1 = ocupat;
            continue;
        }
        if(question == 2)
        {
            fin >> i >> M;
            update(1, 1, N, i, i + M - 1, 0); // 0 = liber;
            continue;
        }

        fout << AINT[1].current << '\n';

    }

    return 0;
}