Cod sursa(job #2096592)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 29 decembrie 2017 14:32:43
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <algorithm>

const int MAXN = 3e3 + 5e2;

struct Box {
  int x, y, z;
  bool operator <(const Box &aux) const {
    return x < aux.x;
  }
} v[MAXN + 1];

int aib[MAXN + 1][MAXN + 1];

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

int getMax(int y, int z) {
  int x = 0;
  for (int i = y; i > 0; i -= i & -i) {
    for (int j = z; j > 0; j -= j & -j) {
      x = max(x, aib[i][j]);
    }
  }
  return x;
}

void update(int y, int z, int val) {
  for (int i = y; i < MAXN; i += i & -i) {
    for (int j = z; j < MAXN; j += j & -j) {
      aib[i][j] = max(aib[i][j], val);
    }
  }
}

int main() {
  int n, t, ans, cr;
  FILE *fin = fopen("cutii.in", "r");
  fscanf(fin, "%d%d", &n, &t);
  FILE *fout = fopen("cutii.out", "w");
  for (; t > 0; --t) {
    for (int i = 1; i <= n; ++i) {
      fscanf(fin, "%d%d%d", &v[i].x, &v[i].y, &v[i].z);
    }
    std::sort(v + 1, v + n + 1);
    ans = 1;
    for (int i = 1; i <= n; ++i) {
      cr = getMax(v[i].y - 1, v[i].z - 1) + 1;
      update(v[i].y, v[i].z, cr);
      ans = max(ans, cr);
    }
    fprintf(fout, "%d\n", ans);
    for (int i = 1; i <= n; ++i) {
      for (int j = v[i].y; j <= n; j += j & -j) {
        for (int k = v[i].z; k <= n; k += k & -k) {
          aib[j][k] = 0;            
        }
      }
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}