Cod sursa(job #23062)

Utilizator stef2nStefan Istrate stef2n Data 27 februarie 2007 23:23:32
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>

#define infile "cutii.in"
#define outfile "cutii.out"
#define NMAX 3500
struct point{short int x,y,z;};

FILE *fin,*fout;
int N;
point p[NMAX],aux[NMAX];
short int AIB[NMAX][NMAX];

void sortare()
  {
   for(int i=1;i<=N;i++)
      p[aux[i].z]=aux[i];
  }

inline int max(int x, int y)
  {
   return (x>y)?x:y;
  }

void modificare(int val, int x, int y)
  {
   int oldy=y;
   while(x<=N)
        {
         y=oldy;
         while(y<=N)
              {
               AIB[x][y]=max(AIB[x][y],val);
               y+=(y^(y&(y-1)));
              }
         x+=(x^(x&(x-1)));
        }
  }

int interogare(int x, int y)
  {
   int oldy=y,sol=0;
   while(x>=1)
        {
         y=oldy;
         while(y>=1)
              {
               sol=max(sol,AIB[x][y]);
               y-=(y^(y&(y-1)));
              }
         x-=(x^(x&(x-1)));
        }
   return sol;
  }

int solve()
  {
   int i,j;
   for(i=1;i<=N;i++)
      for(j=1;j<=N;j++)
         AIB[i][j]=0;
   for(i=1;i<=N;i++)
      modificare(interogare(p[i].x,p[i].y)+1,p[i].x,p[i].y);
   return interogare(N,N);
  }


int main()
{
int i,t;
fin=fopen(infile,"r");
fout=fopen(outfile,"w");
fscanf(fin,"%d %d",&N,&t);
while(t)
     {
      for(i=1;i<=N;i++)
         fscanf(fin,"%d %d %d",&aux[i].x,&aux[i].y,&aux[i].z);
      sortare();
      fprintf(fout,"%d\n",solve());
      t--;
     }
fclose(fin);
fclose(fout);
return 0;
}