Cod sursa(job #442368)

Utilizator indestructiblecont de teste indestructible Data 14 aprilie 2010 11:19:33
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 3505
#define si short int
using namespace std;
struct cutie
{
	int x,y,z;
};
cutie A[NMAX];
int t,n,best[NMAX],rez_f;
si aib[NMAX][NMAX];
void read()
{
	int i;
	for (i=1; i<=n; i++)
		scanf("%d%d%d",&A[i].x,&A[i].y,&A[i].z);
}
bool comp(cutie a,cutie b)
{
	return a.x<b.x;
}
void init()
{
	int i,j;
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
			aib[i][j]=0;
	rez_f=0;
}
int lsb(int x)
{
	return x & -x;
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
int query(int st,int dr)
{
	int i,j,rez=0;
	for (i=st; i>0; i-=lsb(i))
		for (j=dr; j>0; j-=lsb(j))
			rez=max(rez,aib[i][j]);
	return rez;
}
void update2(int st,int dr,int val)
{
	int i,j;
	for (i=st; i<=n; i+=lsb(i))
		for (j=dr; j<=n; j+=lsb(j))
			aib[i][j]=max(aib[i][j],val);
}
void update(int ind1,int ind2)
{
	if (ind1==0)
		return ;
	int i;
	for (i=ind1; i<=ind2; i++)
		update2(A[i].y,A[i].z,best[i]);
}
void solve()
{
	int i,p1=0,p2=0;
	for (i=1; i<=n; i++)
	{
		if (A[i].x!=A[i-1].x)
		{
			update(p1,p2);
			p1=i;
		}
		p2=i;
		best[i]=query(A[i].y-1,A[i].z-1)+1;
		if (best[i]>rez_f)
			rez_f=best[i];
	}
}
int main()
{
	freopen("cutii.in","r",stdin);
	freopen("cutii.out","w",stdout);
	scanf("%d%d",&n,&t);
	while (t--)
	{
		read();
		sort(A+1,A+n+1,comp);
		init();
		solve();
		printf("%d\n",rez_f);
	}
	return 0;
}