Pagini recente » Cod sursa (job #2658716) | Cod sursa (job #951834) | Cod sursa (job #809610) | Cod sursa (job #1575553) | Cod sursa (job #35379)
Cod sursa(job #35379)
#include <stdlib.h>
#include <stdio.h>
#define Nmax 3500
int T,N,i,tt,x[Nmax],y[Nmax],z[Nmax],ind[Nmax],max,nr,AIB[Nmax][Nmax];
void qsort(int l,int r)
{
int i,j,aux,m;
i=l;
j=r;
m=ind[(i+j)/2];
while (i<=j)
{
while (z[ind[i]]<z[m]) ++i;
while (z[ind[j]]>z[m]) --j;
aux=ind[i];
ind[i]=ind[j];
ind[j]=aux;
++i;
--j;
}
if (i<r) qsort(i,r);
if (l<j) qsort(l,j);
}
int get_AIB_max(int indice)
{
int xx,yy,yy2,nr1,nr2,max;
xx=x[ind[indice]]-1;
yy=y[ind[indice]]-1;
nr1=0;
max=0;
while (xx>0)
{
yy2=yy;
nr2=0;
while (yy2>0)
{
if (AIB[xx][yy2]>max) max=AIB[xx][yy2];
else break;
while (yy2 & (1 << nr2)==0) ++nr2;
yy2-=(1 << nr2);
++nr2;
}
while (xx & (1 << nr1)==0) ++nr1;
xx-=(1 << nr1);
++nr1;
}
return max;
}
void update_AIB_max(int indice,int v)
{
int xx,yy,yy2,nr1,nr2;
nr1=0;
xx=x[ind[indice]];
yy=y[ind[indice]];
while (xx<N)
{
yy2=yy;
nr2=0;
while (yy2<N)
{
if (AIB[xx][yy2]<v) AIB[xx][yy2]=v;
else break;
while (yy2 & (1 << nr2)==0) ++nr2;
yy2+=(1 << nr2);
++nr2;
}
while (xx & (1 << nr1)==0) ++nr1;
xx+=(1 << nr1);
++nr1;
}
}
void clear_AIB_max(int indice)
{
int xx,yy,yy2,nr1,nr2;
nr1=0;
xx=x[ind[indice]];
yy=y[ind[indice]];
while (xx<N)
{
yy2=yy;
nr2=0;
while (yy2<N)
{
if (AIB[xx][yy2]>0) AIB[xx][yy2]=0;
else break;
while (yy2 & (1 << nr2)==0) ++nr2;
yy2+=(1 << nr2);
++nr2;
}
while (xx & (1 << nr1)==0) ++nr1;
xx+=(1 << nr1);
++nr1;
}
}
int main()
{
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%d %d",&N,&T);
for (tt=0;tt<T;++tt)
{
for (i=0;i<N;++i)
{
scanf("%d %d %d",&x[i],&y[i],&z[i]);
ind[i]=i;
}
qsort(0,N-1);
max=0;
for (i=0;i<N;++i)
{
nr=get_AIB_max(i)+1;
if (nr>max) max=nr;
update_AIB_max(i,nr);
}
for (i=0;i<N;++i)
clear_AIB_max(i);
printf("%d\n",max);
}
fclose(stdout);
fclose(stdin);
return 0;
}