Cod sursa(job #424396)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 24 martie 2010 20:26:07
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 3510

struct cutie
{
	int x, y, z;
} v[nmax];

int n, a[nmax][nmax], t, sol;

int cmp(cutie a, cutie b)
{
	return a.x<b.x;
}

int query(int x, int y)
{
	/*int r=0, j;
	do
	{
		j=y;
		do
		{
			r=max(r,a[x][j]);
			j=j&(j-1);
		}
		while (j);
		x=x&(x-1);
	} 
	while (x);
	return r;*/
	int c=y, r=0;
	for (; x>0; x-=(x^(x-1))&x)
		for (y=c; y>0; y-=(y^(y-1))&y)
			r=max(r,a[x][y]);
	return r;
}

void update(int x, int y, int val)
{
	int c=y;
	for (; x<=n; x+=(x&(x-1))^x)
		for (y=c; y<=n; y+=(y&(y-1))^y)
			a[x][y]=max(a[x][y],val);
}

int main()
{
	freopen("cutii.in","r",stdin);
	freopen("cutii.out","w",stdout);
	scanf("%d %d",&n,&t);
	int i, c, j;
	while (t--)
	{
		for (i=1; i<=n; i++) scanf("%d %d %d",&v[i].x,&v[i].y,&v[i].z);
		sort(v+1,v+n+1,cmp);
		for (i=1; i<=n; i++)
			for (j=1; j<=n; j++) a[i][j]=0;
		sol=0;
		for (i=1; i<=n; i++)
		{
			c=query(v[i].y-1,v[i].z-1)+1;
			sol=max(sol, c);
			update(v[i].y,v[i].z, c);
		}
		printf("%d\n",sol);
	}
}