Cod sursa(job #3233509)

Utilizator 21CalaDarius Calaianu 21Cala Data 3 iunie 2024 18:13:52
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cmath>

#define NMAX 100005
#define NLOGMAX 18

using namespace std;
const string nume_fisier = "hotel";
ifstream fin(nume_fisier + ".in");
ofstream fout(nume_fisier + ".out");


int pos, val, start, finish;
int n, m;

struct node {
    int maxi, maxdr, maxst;
    bool elafel;
};

vector<node> arb;

void update(int nod, int left, int right)
{
    if (start <= left && finish>= right)
    {
        if (val == 0) {
            arb[nod] = node{ 0,0,0,true };
        }
        else {
            arb[nod] = node{ right - left + 1, right - left + 1, right - left + 1,true };
        }
        return;
    }
    int m = left + right;
    m /= 2;

    if (arb[nod].elafel) {
        if (arb[nod].maxi == 0) {
            arb[2 * nod] = node{ 0,0,0,true };
            arb[2 * nod + 1] = node{ 0,0,0,true };
        }
        else {
            arb[2 * nod] = node{ m - left + 1,m - left + 1,m - left + 1,true };
            arb[2 * nod + 1] = node{ right - m,right - m,right - m,true };
        }
        arb[nod].elafel = false;
    }

    if (start <= m)
        update(2 * nod, left, m);    
    if(m< finish)
        update(2 * nod + 1, m + 1, right);     

    //maxi
    if (arb[2 * nod].maxdr + arb[2 * nod + 1].maxst > max(arb[2 * nod].maxi, arb[2 * nod + 1].maxi))
    {
        arb[nod].maxi = arb[2 * nod].maxdr + arb[2 * nod + 1].maxst;   
    }
    else {
        arb[nod].maxi = max(arb[2 * nod].maxi, arb[2 * nod + 1].maxi);

    }
    //maxi stanga
    if (arb[2 * nod].maxst == m-left+1)
    {
        arb[nod].maxst = m-left+1 + arb[2 * nod + 1].maxst;
    }
    else {
        arb[nod].maxst = arb[2 * nod].maxst;
    }
    //maxi dreapta
    if (arb[2 * nod + 1].maxdr == right-m)
    {
        arb[nod].maxdr = right-m + arb[2 * nod].maxdr;
    }
    else {
        arb[nod].maxdr = arb[2 * nod + 1].maxdr;
    }
}

void afisare()
{
    for (int i = 0; i < arb.size(); ++i)
    {
        cout << arb[i].maxi << " " << arb[i].maxst << " " << arb[i].maxdr << '\n';

    }
    cout << '\n';
}

int main()
{
    fin >> n >> m;
    int arbsize = 1;
    while (arbsize < n) {
        arbsize *= 2;
    }
    arb.resize(2 * arbsize);
    arb[1] = node{ n,n,n,true };
    arb[1] = node{ n,n,n,true };
    for (int i = 0; i < m; ++i)
    {
        int c;
        fin >> c;
        if (c == 1)
        {
            fin >> start >> finish;
            finish += start - 1;
            val = 0;
            update(1, 1, n);
            //afisare();
        }
        else if (c == 2)
        {
            fin >> start >> finish;
            val = 1;
            finish += start - 1;
            update(1, 1, n);
            //afisare();
        }
        else
            fout << arb[1].maxi << '\n';
    }
}