Cod sursa(job #1619768)

Utilizator EpictetStamatin Cristian Epictet Data 28 februarie 2016 19:01:11
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>

using namespace std;

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

struct ARBI { int st, dr, val; } A[300010];
int n, m;

void First_Update(int nod, int left, int right)
{
    if (left == right)
    {
        A[nod].val = A[nod].st = A[nod].dr = 1;
        return;
    }

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

    First_Update((nod << 1), left, mid);
    First_Update((nod << 1) + 1, mid + 1, right);

    A[nod].val = A[(nod << 1)].val + A[(nod << 1) + 1].val;
    A[nod].st = A[(nod << 1)].st + A[(nod << 1) + 1].st;
    A[nod].dr = A[(nod << 1)].dr + A[(nod << 1) + 1].dr;
}

void Update(int nod, int left, int right, int start, int finish, int value)
{
    if (left >= start && right <= finish)
    {
        A[nod].val = A[nod].st = A[nod].dr = value * (right - left + 1);
        return;
    }

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

    if (A[nod].val == (right - left + 1))
    {
        A[(nod << 1)].val = A[(nod << 1)].st = A[(nod << 1)].dr = mid - left + 1;
        A[(nod << 1) + 1].val = A[(nod << 1) + 1].st = A[(nod << 1) + 1].dr = right - mid;
    }
    else if (A[nod].val == 0)
    {
        A[(nod << 1)].val = A[(nod << 1)].st = A[(nod << 1)].dr = 0;
        A[(nod << 1) + 1].val = A[(nod << 1) + 1].st = A[(nod << 1) + 1].dr = 0;
    }

    if (start <= mid)
    {
        Update((nod << 1), left, mid, start, finish, value);
    }
    if (finish > mid)
    {
        Update((nod << 1) + 1, mid + 1, right, start, finish, value);
    }

    A[nod].val = max(A[(nod << 1)].dr + A[(nod << 1) + 1].st, max(A[(nod << 1)].val, A[(nod << 1) + 1].val));
    A[nod].st = (A[(nod << 1)].st == (mid - left + 1) ? A[(nod << 1)].st + A[(nod << 1) + 1].st : A[(nod << 1)].st);
    A[nod].dr = (A[(nod << 1) + 1].dr == (right - mid) ? A[(nod << 1) + 1].dr + A[(nod << 1)].dr : A[(nod << 1) + 1].dr);
}

int main()
{
    fin >> n >> m;
    First_Update(1, 1, n);
    while (m --)
    {
        int tip, i, nr;
        fin >> tip;
        switch (tip)
        {
            case 1 :
            {
                fin >> i >> nr;
                Update(1, 1, n, i, i + nr - 1, 0);
                break;
            }
            case 2 :
            {
                fin >> i >> nr;
                Update(1, 1, n, i, i + nr - 1, 1);
                break;
            }
            case 3 :
            {
                fout << A[1].val << '\n';
                break;
            }
        }
    }

    fout.close();
    return 0;
}