Cod sursa(job #15069)

Utilizator robbyRobertino robert robby Data 10 februarie 2007 17:26:26
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <stdlib.h>
#define nmax 3501
typedef struct cutie
{
  int a,b,c;
}cutie;

cutie a[nmax];
int v[nmax][nmax];
int n;

int compare(const void *x,const void *y)
{
  return (*(cutie*)x).a-(*(cutie*)y).a;
}

int max(int x,int y)
{
  int i,j,max=0;

  for (i=x;i>=1;i=i-(i&(i^(i-1))))
	for (j=y;j>=1;j=j-(j&(j^(j-1))))
	  if (v[i][j]>max)
		max=v[i][j];
  return max;
}

void add(int x,int y)
{
  int i,j;

  for (i=x;i<=n;i=i+(i&(i^(i-1))))
	for (j=y;j<=n;j=j+(j&(j^(j-1))))
	  if (v[x][y]>v[i][j])
		v[i][j]=v[x][y];
}

FILE *f,*g;
int main()
{
  int t,i,j,l;
  f=fopen("cutii.in","rt");
  g=fopen("cutii.out","wt");
  fscanf(f,"%d %d",&n,&t);
  for (l=1;l<=t;l++)
	{
	  for (i=1;i<=n;i++)
		fscanf(f,"%d %d %d",&a[i].a,&a[i].b,&a[i].c);

	  qsort(a+1,n,sizeof(cutie),compare);

	  for (i=1;i<=n;i++)
		{
		  v[a[i].b][a[i].c]=max(a[i].b-1,a[i].c-1)+1;
		  add(a[i].b,a[i].c);
		}
	  fprintf(g,"%d\n",max(n,n));
	  for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
		  v[i][j]=0;
	}
  fclose(f);
  fclose(g);
  return 0;
}