Cod sursa(job #2120388)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 2 februarie 2018 13:28:16
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstdio>

const int MAXN = 1e5;

struct U {
  int ans, b, e;
} aint[4 * MAXN + 1];

static inline int max(int a, int b) {
  return a > b ? a : b;
}

void build(int pos, int l, int r) {
  aint[pos].ans = aint[pos].b = aint[pos].e = r - l + 1;
  if (l < r) {
    int m = (l + r) >> 1;
    build(2 * pos, l, m);
    build(2 * pos + 1, m + 1, r);
  }
}

void update(int pos, int l, int r, int a, int b, int t) {
  if (a <= l && r <= b) {
    aint[pos].ans = aint[pos].b = aint[pos].e = t * (r - l + 1);
  } else {
    int m = (l + r) >> 1;
    if (!aint[pos].ans) {
      aint[2 * pos] = aint[2 * pos + 1] = {0, 0, 0};
    } else if (aint[pos].ans == r - l + 1) {
      aint[2 * pos] = {m - l + 1, m - l + 1, m - l + 1};
      aint[2 * pos + 1] = {r - m, r - m, r - m};
    }
    if (a <= m) {
      update(2 * pos, l, m, a, b, t);
    }
    if (m < b) {
      update(2 * pos + 1, m + 1, r, a, b, t);
    }
    aint[pos] = {max(aint[2 * pos].e + aint[2 * pos + 1].b, max(aint[2 * pos].ans, aint[2 * pos + 1].ans)), 
                 aint[2 * pos].b, aint[2 * pos + 1].e};
    if (aint[2 * pos].ans == m - l + 1) {
      aint[pos].b += aint[2 * pos + 1].b;
    }
    if (aint[2 * pos + 1].ans == r - m) {
      aint[pos].e += aint[2 * pos].e;
    }
  }
}

int main() {
  int n, q, t, c, m;
  FILE *fin = fopen("hotel.in", "r");
  fscanf(fin, "%d%d", &n, &q);
  build(1, 1, n);
  FILE *fout = fopen("hotel.out", "w");
  for (int i = 0; i < q; ++i) {
    fscanf(fin, "%d", &t);
    if (t == 3) {
      fprintf(fout, "%d\n", aint[1].ans);
    } else {
      fscanf(fin, "%d%d", &c, &m);
      update(1, 1, n, c, c + m - 1, t - 1);
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}