Cod sursa(job #36775)

Utilizator amadaeusLucian Boca amadaeus Data 24 martie 2007 00:42:02
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define NX 3501
#define shift(X) X += X & ( X ^ (X-1) )
#define strip(X) X &= X - 1

struct cutie {
	int x, y, z;
};

struct cmp {
	bool operator() ( cutie a, cutie b ) {
		return a.z < b.z;
	}
};

cutie v[NX];
int N, T;

inline
void umax( int& x, int y ) {
	if( x < y )
		x = y;
}

struct BIT {
	int a[NX][NX];

	void update( int x, int y, int val ) {
		int i, j;
		for( i = x; i <= N; shift(i) )
			for( j = y; j <= N; shift(j) )
				umax( a[i][j], val );
	}

	int query( int x, int y ) {
		int i, j, r = 0;
		for( i = x; i; strip(i) )
			for( j = y; j; strip(j) )
				umax( r, a[i][j] );
		return r;
	}

	void init() {
		memset( a, 0, sizeof(a) );
	}
} A;
	
void cit() {
	int i, val, best;
	
	scanf( "%d%d", &N, &T );

	for( ; T; T-- ) {
		A.init(); best = 0;
		
		for( i = 1; i <= N; i++ )
			scanf( "%d%d%d", &v[i].x, &v[i].y, &v[i].z );

		sort( v+1, v+1+N, cmp() );

		for( i = 1; i <= N; i++ ) {
			val = A.query( v[i].x - 1, v[i].y - 1 ) + 1;
			A.update( v[i].x, v[i].y, val );
			umax( best, val );
		}
		printf( "%d\n", best );
	}
}

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

	cit();

	return 0;
}