Cod sursa(job #35390)

Utilizator VmanDuta Vlad Vman Data 22 martie 2007 00:23:19
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#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",&z[i],&x[i],&y[i]);
        --x[i];
        --y[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;
}