Cod sursa(job #2755626)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 27 mai 2021 20:27:57
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>

using namespace std;

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

struct node {
  int pref, suf, best;
  short lazy;
} emptyNode{0, 0, 0, -1};

struct SegTree {
  int Size;
  vector<node> tree;

  SegTree(int N) {
    Size = 1;
    while (Size < N)
      Size <<= 1;
    tree.resize(Size << 1);
  }

  node join(const node &a, const node &b, int len_a, int len_b) {
    node x;
    x.pref = a.pref;
    x.lazy = -1;
    if (a.pref == len_a)
      x.pref += b.pref;
    x.suf = b.suf;
    if (b.suf == len_b)
      x.suf += a.suf;
    x.best = max({a.best, b.best, a.suf + b.pref});
    return x;
  }

  void build(int x, int lx, int rx) {
    if (lx == rx) {
      tree[x] = {1, 1, 1, -1};
      return;
    }
    int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
    build(lSon, lx, mid);
    build(rSon, mid + 1, rx);
    tree[x] = join(tree[lSon], tree[rSon], mid - lx + 1, rx - mid);
  }

  void push(int x, int lx, int rx) {
    short val = tree[x].lazy;
    if (lx == rx || val == -1)
      return;
    int mid = (lx + rx) >> 1;
    int l[] = {mid - lx + 1, rx - mid};
    for (int i = 0; i < 2; ++i) {
      int son = x << 1 | i;
      if (val)
        tree[son] = {0, 0, 0, val};
      else tree[son] = {l[i], l[i], l[i], val};
    }
    tree[x].lazy = -1;
  }

  void update(int x, int lx, int rx, int st, int dr, bool val) {
    if (st <= lx && rx <= dr) {
      int l = rx - lx + 1;
      if (val)
        tree[x] = {0, 0, 0, val};
      else tree[x] = {l, l, l, val};
      return;
    }
    push(x, lx, rx);
    int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
    if (st <= mid)
      update(lSon, lx, mid, st, dr, val);
    if (mid < dr)
      update(rSon, mid + 1, rx, st, dr, val);
    tree[x] = join(tree[lSon], tree[rSon], mid - lx + 1, rx - mid);
  }
};

int main() {
  int N, Q;
  fin >> N >> Q;
  SegTree tree(N);
  tree.build(1, 1, N);
  for (int q = 0; q < Q; ++q) {
    int t;
    fin >> t;
    if (t < 3) {
      int st, M;
      fin >> st >> M;
      tree.update(1, 1, N, st, st + M - 1, t == 1);
    } else fout << tree.tree[1].best << '\n';
  }
  fin.close();
  fout.close();
  return 0;
}