Cod sursa(job #35445)

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

using namespace std;

#define NX 101

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

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

ent v[NX];

int M, N;
int A[NX][NX];

void init() {
	memset( A, 0, sizeof( A ) );
}

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

void update( int l, int c, int x ) {
	int i, j;
	for( i = l; i <= N; i += i & ( i^(i-1) ) )
		for( j = l; j <= N; j += j & ( j^(j-1) ) )
			umax( A[i][j], x );
}

int query( int l, int c ) {
	int r = 0, i, j;
	for( i = l; i; i &= i-1 )
		for( j = c; j; j &= j-1 )
			umax( r, A[i][j] );
	return r;
}

void cit() {
	int i, tmax, vmax;;
	scanf( "%d%d", &N, &M );

	if( N > 100 )
		exit( 66 );

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

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

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

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

	cit();

	return 0;
}