Cod sursa(job #945076)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 30 aprilie 2013 13:47:03
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
#include<algorithm>

using namespace std;

class box{
public:
  int x, y, z;

  box(){};

  box(int x1, int y1, int z1){
    x = x1;
    y = y1;
    z = z1;
  }

};

int cmp(box a, box b){
  return a.x < b.x;
}

int n, aib[3505][3505];

inline int lsb(int &x){
  return x & -x;
}

void update(int x, int y, int val){
  for(int i = x; i <= n; i += lsb(i))
    for(int j = y; j <= n; j += lsb(j))
      aib[i][j] = max(aib[i][j], val);
}

void update0(int x, int y){
  for(int i = x; i <= n; i += lsb(i))
    for(int j = y; j <= n; j += lsb(j))
      aib[i][j] = 0;
}

int query(int x, int y){
  int vl = 0;
  for(int i = x; i > 0; i -= lsb(i))
    for(int j = y; j > 0; j -= lsb(j))
      vl = max(vl, aib[i][j]);
  return vl;
}

box gv[3505];

int main(){
  ifstream in("cutii.in");
  ofstream out("cutii.out");

  int tests;
  in >> n;
  in >> tests;

  while(tests--){
    int ans = 0;

    for(int i = 1; i <= n; ++i)
      in >> gv[i].x >> gv[i].y >> gv[i].z;

    sort(gv + 1, gv + n + 1, cmp);

    for(int i = 1; i <= n; ++i){
      int pans = query(gv[i].y - 1, gv[i].z - 1) + 1;
      update(gv[i].y, gv[i].x, pans);
      ans = max(ans , pans);
    }

    out << ans << "\n";

    for(int i = 1; i <= n; ++i)
      update0(gv[i].y, gv[i].x);
  }

  return 0;
}