Pagini recente » Cod sursa (job #2845106) | Cod sursa (job #3040316) | Cod sursa (job #2187191) | Cod sursa (job #1546634) | Cod sursa (job #146854)
Cod sursa(job #146854)
#include <stdio.h>
#include <string.h>
#define Nmax 3505
#define pk(x) ((x^(x-1))&x)
struct cutie { int x,y,z; };
int N,T,i,maxim;
int v[Nmax];
int A[Nmax][Nmax];
cutie C[Nmax];
inline int max(int a,int b) { return a>b?a:b; }
void qsort(int st,int dr)
{
int i=st,j=dr,m=C[(st+dr)>>1].z;
cutie aux;
while (i<=j)
{
while (C[i].z<m) ++i;
while (C[j].z>m) --j;
if (i<=j)
{
aux=C[i]; C[i]=C[j]; C[j]=aux;
++i; --j;
}
}
if (i<dr) qsort(i,dr);
if (st<j) qsort(st,j);
}
int query(int w)
{
int i,j,m=0;
for (i=C[w].x-1; i>0; i-=pk(i))
for (j=C[w].y-1; j>0; j-=pk(j))
m=max(m,A[i][j]);
return m;
}
void update(int w)
{
int i,j;
for (i=C[w].x; i<=N; i+=pk(i))
for (j=C[w].y; j<=N; j+=pk(j))
A[i][j]=max(A[i][j],v[w]);
}
void reset(int w)
{
int i,j;
for (i=C[w].x; i<=N; i+=pk(i))
for (j=C[w].y; j<=N; j+=pk(j))
A[i][j]=0;
}
void gogogo()
{
int j;
for (i=1,maxim=0;i<=N;++i)
{
v[i]=query(i)+1;
maxim=max(maxim,v[i]);
if (C[i].z!=C[i+1].z)
{
j=i;
while (C[j].z==C[j-1].z)
{
update(j);
--j;
}
update(j);
}
}
}
int main()
{
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%d %d",&N,&T);
while (T)
{
--T;
for (i=1;i<=N;++i)
scanf("%d %d %d",&C[i].x,&C[i].y,&C[i].z);
qsort(1,N);
gogogo();
printf("%d\n",maxim);
for (i=1;i<=N;++i)
reset(i);
}
fclose(stdout);
return 0;
}