Pagini recente » Cod sursa (job #1815180) | Cod sursa (job #3222771) | Cod sursa (job #179846) | Cod sursa (job #2189860) | Cod sursa (job #35418)
Cod sursa(job #35418)
#include <stdlib.h>
#include <stdio.h>
#define Nmax 3501
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,m,aux;
i=l;
j=r;
m=ind[(l+r)/2];
do
{
while (z[ind[i]]>z[m]) ++i;
while (z[m]>z[ind[j]]) --j;
if (i<=j)
{
aux=ind[i];ind[i]=ind[j];ind[j]=aux;
++i;
--j;
}
}
while (i<=j);
if (l<j) qsort(l,j);
if (i<r) qsort(i,r);
}
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",&z[i],&x[i],&y[i]);
ind[i]=i;
}
qsort(0,N-1);
max=0;
for (i=N-1;i>=0;--i)
{
nr=get_AIB_max(i)+1;
if (nr>max) max=nr;
update_AIB_max(i,nr);
}
for (i=N-1;i>=0;--i)
clear_AIB_max(i);
printf("%d\n",max);
}
fclose(stdout);
fclose(stdin);
return 0;
}