Pagini recente » Cod sursa (job #2315459) | Cod sursa (job #1038221) | Cod sursa (job #860508) | Cod sursa (job #2906639) | Cod sursa (job #14772)
Cod sursa(job #14772)
#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;
}