Cod sursa(job #2525058)

Utilizator dimi999Dimitriu Andrei dimi999 Data 16 ianuarie 2020 19:10:05
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Aint
{
    int ans,left,right,viz;

}aint[400005];

void update(int node, int l, int r, int lc, int rc, int val)
{
    if(lc <= l && rc >= r)
    {
        aint[node].viz = 1;
        if(val == 1)
            aint[node].left = aint[node].right = aint[node].ans = 0;
        else
            aint[node].left = aint[node].right = aint[node].ans = r - l + 1;
        return;
    }

    int mij = (l + r) / 2;

    if(aint[node].viz == 1)
    {
        aint[node].viz = 0;
        if(aint[node].ans == 0)
        {
            aint[2*node].ans = aint[2*node].left = aint[2*node].right = 0;
            aint[2*node + 1].ans = aint[2*node + 1].left = aint[2*node + 1].right = 0;
        }
        else
        {
            aint[2*node].ans = aint[2*node].left = aint[2*node].right = mij - l + 1;
            aint[2*node + 1].ans = aint[2*node + 1].left = aint[2*node + 1].right = r - mij;
        }
        aint[2*node].viz = aint[2*node + 1].viz = 1;
    }

    if(lc <= mij)
        update(2*node, l, mij, lc, rc, val);
    if(rc > mij)
        update(2*node + 1, mij + 1, r, lc, rc, val);
    aint[node].ans = max(max(aint[2*node].ans, aint[2*node + 1].ans),
                          aint[2*node].right + aint[2*node + 1].left);
    aint[node].left = aint[2*node].left;
    aint[node].right = aint[2*node + 1].right;
    if(aint[node].left == mij - l + 1)
        aint[node].left += aint[2*node + 1].left;
    if(aint[node].right == r - mij)
        aint[node].right += aint[2*node].right;
}

int main()
{
   int n, p;
   fin >> n >> p;
   update(1, 1, n, 1, n, 2);
   for(int i = 1; i <= p; i++)
   {
       int op, x, y;
       fin >> op;
       if(op == 3)
            fout << aint[1].ans << '\n';
       else
       {
           fin >> x >> y;
           update(1, 1, n, x, y + x - 1, op);
       }
   }
    return 0;
}