Mai intai trebuie sa te autentifici.

Cod sursa(job #405539)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 28 februarie 2010 11:45:17
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct vect
{
	short int x,y,z;
};
short int n,t,aib[3505][3505];
vect v[3505];

int cmp(vect a, vect b)
{
	return a.z<b.z;
}

inline int lsb(short int x){return x&-x;}

void update(short int x, short int y, short int z)
{
	short int i,j;
	for(i=x;i<=n;i+=lsb(i))
		for(j=y;j<=n;j+=lsb(j))
			if(aib[i][j]<z)
				aib[i][j]=z;
}

short int query(short int x, short int y)
{
	short int i,j,ret=0;
	for(i=x;i;i-=lsb(i))
		for(j=y;j;j-=lsb(j))
			if(aib[i][j]>ret)
				ret=aib[i][j];
	return ret;
}

int main()
{
	freopen("cutii.in","r",stdin);
	freopen("cutii.out","w",stdout);
	scanf("%hd%hd",&n,&t);
	short int i,x,sol;
	while(t--)
	{
		memset(aib,0,sizeof(aib));
		sol=0;
		for(i=1;i<=n;i++)
			scanf("%hd%hd%hd",&v[i].x,&v[i].y,&v[i].z);
		sort(v+1,v+n+1,cmp);
		for(i=1;i<=n;i++)
		{
			x=query(v[i].x-1,v[i].y-1)+1;
			if(x>sol)
				sol=x;
			update(v[i].x,v[i].y,x);
		}
		printf("%hd\n",sol);
	}
	return 0;
}