Cod sursa(job #952685)

Utilizator primulDarie Sergiu primul Data 23 mai 2013 20:02:07
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 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].z, pans);
      ans = max(ans , pans);
    }
 
    out << ans << "\n";
 
    for(int i = 1; i <= n; ++i)
      update0(gv[i].y, gv[i].z);
  }
 
  return 0;
}