Cod sursa(job #2071536)

Utilizator cella.florescuCella Florescu cella.florescu Data 20 noiembrie 2017 19:25:00
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;

struct Node {
  int ans, pref, suff;
};

Node aint[4 * MAXN];

void build(int node, int l, int r) {
  aint[node].ans = aint[node].pref = aint[node].suff = r - l + 1;
  if (l < r) {
    int mid = (l + r) / 2;
    build(2 * node, l, mid);
    build(2 * node + 1, mid + 1, r);
  }
}

void update(int node, int l, int r, int ql, int qr, int val) {
  if (ql <= l && r <= qr) {
    aint[node].ans = aint[node].pref = aint[node].suff = val * (r - l + 1);
    return;
  }
  int mid = (l + r) / 2, lson = 2 * node, rson = 2 * node + 1;
  if (aint[node].ans == 0)
    aint[lson] = aint[rson] = {0, 0, 0};
  else if (aint[node].ans == r - l + 1) {
    aint[lson] = {mid - l + 1, mid - l + 1, mid - l + 1};
    aint[rson] = {r - mid, r - mid, r - mid};
  }
  if (ql <= mid)
    update(lson, l, mid, ql, qr, val);
  if (mid < qr)
    update(rson, mid + 1, r, ql, qr, val);
  aint[node] = {max(aint[lson].suff + aint[rson].pref, max(aint[lson].ans, aint[rson].ans)), aint[lson].pref, aint[rson].suff};
  if (aint[lson].ans == mid - l + 1)
    aint[node].pref += aint[rson].pref;
  if (aint[rson].ans == r - mid)
    aint[node].suff += aint[lson].suff;
}

int main()
{
    int n, p, type, x, l;
    ifstream fin("hotel.in");
    fin >> n >> p;
    build(1, 1, n);
    ofstream fout("hotel.out");
    for (p = p; p > 0; --p) {
      fin >> type;
      if (type == 3)
        fout << aint[1].ans << '\n';
      else {
        fin >> x >> l;
        l += x - 1;
        update(1, 1, n, x, l, type - 1);
      }
    }
    fin.close();
    fout.close();
    return 0;
}