Cod sursa(job #479025)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 21 august 2010 22:13:04
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<algorithm>
using namespace std;

#define N_MAX 3502
struct p
{
	int x,y,z;
	p()
	{
		x=y=z=0;
	}
	p(const int x,const int y,const int z)
	{
		this->x=x;
		this->y=y;
		this->z=z;
	}
	bool operator < (const p &other) const
	{
		return this->z<other.z;
	}
};
p cutie[N_MAX];

int aib[N_MAX][N_MAX];
int t,n;

inline int LSB(int x)
{
	return x&(-x);
}

void set(int x,int y,int val)
{
	for(int i=x;i<=n;i+=LSB(i))
		for(int j=y;j<=n;j+=LSB(j))
			aib[i][j]=val;
}
void update(int x,int y,int val)
{
	for(int i=x;i<=n;i+=LSB(i))
		for(int j=y;j<=n;j+=LSB(j))
			aib[i][j]=max(aib[i][j],val);
}

int query(int x,int y)
{
	int val=0;
	for(int i=x;i>0;i-=LSB(i))
		for(int j=y;j>0;j-=LSB(j))
			val=max(val,aib[i][j]);
	return val;
}

int solve()
{
	int i,x,y,z;
	int Max=0;
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		cutie[i]=p(x,y,z);
	}

	sort(cutie+1,cutie+n+1);

	for(i=1;i<=n;i++)
		set(cutie[i].x,cutie[i].y,0);

	for(i=1;i<=n;i++)
	{
		int best=query(cutie[i].x-1,cutie[i].y-1);
		update(cutie[i].x,cutie[i].y,best+1);
		if(best+1>Max)
			Max=best+1;
	}
	return Max;
}

int main()
{
	freopen("cutii.in","r",stdin);
	freopen("cutii.out","w",stdout);
	
	scanf("%d%d",&n,&t);

	for(int i=1;i<=t;i++)
	{
		printf("%d\n",solve());
	}

	return 0;
}