Cod sursa(job #600725)

Utilizator Smaug-Andrei C. Smaug- Data 2 iulie 2011 22:37:07
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define MAXN 3505

int X[MAXN], Y[MAXN], Z[MAXN], A[MAXN][MAXN], N, I[MAXN];

struct cmp {
  bool operator()(const int &a, const int &b)const{
    return Z[a]<Z[b];
  }
};

inline int lbit(int x){
  return ((x^(x-1)) & x);
}

int Query(int x, int y){

  int r=0, i, j;

  for(i=x; i; i-=lbit(i))
    for(j=y; j; j-=lbit(j))
      r=max(r, A[i][j]);

  return r;

}

void Update(int x, int y, int v){

  int i, j;

  for(i=x; i<=N; i+=lbit(i))
    for(j=y; j<=N; j+=lbit(j)){
      if(v == 0)
	A[i][j]=0;
      else
	A[i][j]=max(A[i][j], v);
    }
}

int main(){

  freopen("cutii.in", "r", stdin);
  freopen("cutii.out", "w", stdout);

  int T, i, r, aux;

  scanf("%d%d", &N, &T);

  while(T--){
    for(i=1; i<=N; i++){
      scanf("%d%d%d", X+i, Y+i, Z+i);
      I[i]=i;
    }
    
    sort(I+1, I+N+1, cmp());

    r=0;
    for(i=1; i<=N; i++){
      aux=Query(X[I[i]]-1, Y[I[i]]-1)+1;
      Update(X[I[i]], Y[I[i]], aux);
      r=max(r, aux);
    }

    for(i=1; i<=N; i++)
      Update(X[I[i]], Y[I[i]], 0);

    printf("%d\n", r);

  }

  return 0;

}