Cod sursa(job #15116)

Utilizator vmaneavmanea vmanea Data 10 februarie 2007 19:55:03
Problema Cutii Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.05 kb
// [n * (n - 1) / 2]

#include <stdio.h>
#define nmax 3505

int parcurg(int);

int N,T,t,i,j;

int L[nmax][nmax];

int X[nmax], Y[nmax], Z[nmax], MAX[nmax];

int main(void)

{

 freopen("cutii.in", "r", stdin);

 freopen("cutii.out", "w", stdout);

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

 for (t = 1; t <= T; ++t)
 {
	for (i = 1; i <= N; ++i)
		L[0][i] = MAX[i] = 0;

	for (i = 1; i <= N; ++i)
	{
		scanf("%d%d%d", &X[i], &Y[i], &Z[i]);

		for (j = 1; j < i; ++j)
			if (X[j] > X[i] && Y[j] > Y[i] && Z[j] > Z[i])
				L[++L[0][j]][j] = i;
			else if (X[j] < X[i] && Y[j] < Y[i] && Z[j] < Z[i])
				L[++L[0][i]][i] = j;

	}

	for (i = 1; i <= N; ++i)
		if (!MAX[i])
			MAX[i] = parcurg(i);

	for (i = 1, MAX[0] = 0; i <= N; ++i)
		MAX[0] = MAX[i] > MAX[0]? MAX[i]: MAX[0];

	printf("%d\n", MAX[0]);
 }

 return 0;
}

int parcurg(int x)
{
	int i, nr = 0;

	for (i = 1; i <= L[0][x]; ++i)
	{
		if (!MAX[L[i][x]])
			MAX[L[i][x]] = parcurg(L[i][x]);

		nr = nr > MAX[L[i][x]]? nr: MAX[L[i][x]];
	}

	return 1 + nr;
}