Pagini recente » Cod sursa (job #1240620) | Cod sursa (job #13422) | Cod sursa (job #2811942) | Cod sursa (job #2564527) | Cod sursa (job #79598)
Cod sursa(job #79598)
#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;
}