Cod sursa(job #79598)

Utilizator vladcoderVlad Ion vladcoder Data 23 august 2007 11:31:22
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <string.h>
#define NMAX 3502
#define FIN "cutii.in"
#define FOUT "cutii.out"

int AIB[NMAX][NMAX];

typedef struct nod
{
	int x, y, z;
} NOD;

NOD V[NMAX];

FILE * fin, * fout;
int N, T, i, j, k, max;
int IND[NMAX];

void poz( int lo, int hi )
{
	int di = 0, dj = - 1, i = lo, j = hi, aux;
	while (i < j)
	{
		if ( V[IND[i]].z > V[IND[j]].z )
		{
			aux = IND[i]; IND[i] = IND[j]; IND[j] = aux;
			aux = di; di = - dj; dj = - aux;
		}
		i += di;
		j += dj;
	}
	k = i;
}
void quick( int lo, int hi )
{
	if ( lo < hi )
	{
		poz( lo, hi );
		quick( lo, k - 1 );
		quick( k + 1, hi );
	}
}

void update( int x, int y, int value )
{
	int i = x, j = y;
	while ( i <= N )
	{
		j = y;
		while ( j <= N )
		{
			if ((AIB[i][j] < value ) || ( !value) ) AIB[i][j] = value;
			j += ((j-1)^j) & j;
		}
		i += ((i-1)^i) & i;
	}
}

int query( int x, int y )
{
	int i = x, j = y, max = 0;
	while ( i > 0 )
	{
		j = y;
		while ( j > 0 )
		{
			if (AIB[i][j] > max ) max = AIB[i][j];
			j -= ((j-1)^j) & j;
		}
		i -= ((i-1)^i) & i;
	}
	return max;
}

int main()
{
	fin = fopen( FIN, "r" );
	fout = fopen( FOUT, "w" );
	fscanf( fin, "%d %d\n", &N, &T );
	memset( AIB, 0, sizeof(AIB) );
	while (T)
	{
		for( i = 1; i <= N; i++) 
		{
			fscanf( fin, "%d %d %d\n", &V[i].x, &V[i].y, &V[i].z );
			IND[i] = i;
		}
		quick( 1, N ); max = 0;
		for( i = 1; i <= N; i++)
		{
			int p = query( V[IND[i]].x - 1, V[IND[i]].y - 1 );
			if ( p + 1 > max ) max = p + 1;
			update( V[IND[i]].x, V[IND[i]].y, p + 1 );
		}
		fprintf( fout, "%d\n", max );
		T--;
		// clean AIB
		for( i = 1; i <= N; i++) update( V[i].x, V[i].y, 0 );
	}
	fclose( fin );
	fclose( fout );
	return 0;
}