Cod sursa(job #14772)

Utilizator peanutzAndrei Homorodean peanutz Data 9 februarie 2007 18:43:06
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>

#define NMAX 4000

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

cutie a[NMAX];
int n, t;
int sol[NMAX];

void read()
{
int i;

for(i = 0; i < n; ++i)
	scanf("%d %d %d\n", &a[i].x, &a[i].y, &a[i].z);
}


inline int criteriu(cutie a, cutie b)
{
if((a.x > b.x)  ||  ((a.x == b.x) && (a.y > b.y))  || ((a.x == b.x)  &&  (a.y == b.y) && (a.z > b.z)))
	return 1;

return 0;
}

int divide(int p, int q)
{
int st = p, dr = q;
cutie x = a[p];


while(st < dr)
	{
		while(st < dr  &&  !criteriu(x, a[dr])) --dr;
		a[st] = a[dr];

		while(st < dr  &&   criteriu(x, a[st])) ++st;
		a[dr] = a[st];
	}

a[st] = x;

return st;
}


void qsort(int p, int q)
{
int m = divide(p, q);

if(m-1 > p)
	qsort(p, m-1);

if(m+1 < q)
	qsort(m+1, q);

}

inline int incape(cutie a, cutie b)
{
return ((a.x > b.x) && (a.y > b.y) && (a.z > b.z));
}

int subsir()
{
int max = -32000;
int i, j;

for(i = 0; i < n; ++i)
	{
		for(sol[i] = 1, j = i-1; j > -1; --j)
			{
				if((sol[i] < sol[j]+1)  &&  (incape(a[i], a[j])))

					sol[i] = sol[j]+1;

			}

		if(max < sol[i])
			max = sol[i];
	}

return max;
}

int main()
{
int i;

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

scanf("%d %d\n", &n, &t);

for(i = 0; i < t; ++i)
	{
		read();

		qsort(0, n-1);

		//memset(sol, 0, sizeof(sol));

		printf("%d\n", subsir());

	}

fclose(stdin);
fclose(stdout);

return 0;
}