Cod sursa(job #2346406)

Utilizator PetyAlexandru Peticaru Pety Data 17 februarie 2019 17:31:02
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, tip, x, y;
int aint[400002], l[400002], r[400002];


void update (int nod, int st, int dr, int x, int y, int val) {
  if (x == st && dr == y) {
    aint[nod] = l[nod] = r[nod] = val * (dr - st + 1);
    return;
  }
  int mij = (st + dr) / 2;
  if (aint[nod] == 0)
    aint[2  * nod] = aint[2 * nod + 1] = l[2 * nod] = l[2 * nod + 1] = r[2 * nod] = r[2 * nod + 1] = 0;
  if (aint[nod] == (dr - st + 1)) {
    aint[2 * nod] = l[2 * nod] = r[2 * nod] = mij - st + 1;
    aint[2 * nod + 1] = l[2 * nod + 1] = r[2 * nod + 1] = dr - mij;
  }
  if (y <= mij)
    update(2 * nod, st, mij, x, y, val);
  else if (x > mij)
    update(2 * nod + 1, mij + 1, dr, x, y, val);
  else {
    update(2 * nod, st, mij, x, mij, val);
    update(2 * nod + 1, mij + 1, dr, mij + 1, y, val);
  }
  l[nod] = l[2 * nod];
  r[nod] = r[2 * nod + 1];
  if(l[2 * nod] == mij - st + 1)
    l[nod] += l[2 * nod + 1];
  if (r[2 * nod + 1] == dr - mij)
    r[nod] += r[2 * nod];
  aint[nod] = max(aint[2 * nod], max(aint[2 * nod + 1], r[2 * nod] + l[2 * nod + 1]));
}

int main()
{
  fin >> n >> m;
  update(1, 1, n, 1, n, 1);
  while (m--) {
    fin >> tip;
    if(tip == 3)
      fout << aint[1] << "\n";
    else {
      fin >> x >> y;
      y = x + y - 1;
      update(1, 1, n, x, y, 1 - tip % 2);
    }
  }
  return 0;
}