Cod sursa(job #23675)

Utilizator diac_paulPaul Diac diac_paul Data 1 martie 2007 10:27:11
Problema Cutii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <stdlib.h>
FILE *fin,*fout;
#define nmax 3505
typedef struct cutie
{
 int x,y,z;
}cutie;
cutie h[nmax];
int n,t;
int comp(const void *a,const void *b)
{
 return (*(cutie*)a).x-(*(cutie*)b).x;
}
int m[nmax][nmax],p2[nmax];
int pow2(int x)
{
 int p=1;
 while (x%2==0)
 {
  p*=2;
  x/=2;
 }
 return p;
}
void make_0(int x,int y)
{
 int ix,iy;
 for (ix=x;ix<=n;ix+=p2[ix])
 for (iy=y;iy<=n;iy+=p2[iy]) m[ix][iy]=0;
}
int maxim(int x,int y)
{
 if (x>y) return x;
 else return y;
}
void maximizeaza(int x,int y)
{
 int ix,iy;
 for (ix=x;ix<=n;ix+=p2[ix])
 for (iy=y;iy<=n;iy+=p2[iy]) m[ix][iy]=maxim(m[ix][iy],m[x][y]);
}
int det_max(int x,int y)
{
 int ix,iy,ma=0;
 if ((x>0)||(y>0))
 {
  for (ix=x;ix>0;ix-=p2[ix]) ma=maxim(ma,m[ix][y]);
  for (iy=y;iy>0;iy-=p2[iy]) ma=maxim(ma,m[x][iy]);
  ma=maxim(ma,det_max(x-p2[x],y-p2[y]));
  return ma;
 }
 else return 0;
}
int main()
{
 int i,j,max;
 fin=fopen("cutii.in","rt");
 fout=fopen("cutii.out","wt");
 fscanf(fin,"%d %d",&n,&t);
 for (i=1;i<=n;i++) p2[i]=pow2(i);
 while (t)
 {
  for (i=0;i<n;i++) fscanf(fin,"%d %d %d",&h[i].x,&h[i].y,&h[i].z);
  qsort(h,n,sizeof(h[0]),comp);
  max=0;
  for (i=0;i<n;i++)
  {
   m[h[i].y][h[i].z]=det_max(h[i].y,h[i].z)+1;
   maximizeaza(h[i].y,h[i].z);
   if (m[h[i].y][h[i].z]>max) max=m[h[i].y][h[i].z];
  }
  fprintf(fout,"%d\n",max);
  for (i=0;i<n;i++) make_0(h[i].y,h[i].z);
  t--;
 }
 fclose(fin);
 fclose(fout);
 return 0;
}