Cod sursa(job #146854)

Utilizator VmanDuta Vlad Vman Data 2 martie 2008 12:04:09
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#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;
}