Cod sursa(job #806193)

Utilizator Marius96Marius Gavrilescu Marius96 Data 2 noiembrie 2012 00:25:10
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

#define MX 3505
#define MY 3505

using std::sort;
using std::max;

int t[MX][MY];

struct str
{
	int x,y,z;

	str()
		{
			x=y=z=0;
		}

	str (int xx,int yy,int zz)
		{
			x=xx;
			y=yy;
			z=zz;
		}

	bool operator<(const str s)const
		{
			if(x<s.x)
				return true;
			if(x>s.x)
				return false;
			if(y<s.y)
				return true;
			if(y>s.y)
				return false;
			return z<s.z;
		}
}v[3505];

void u (int i,int j,int v)
{
	int sj=j;
	while(i<MX){
		while(j<MY){
			t[i][j]=max (t[i][j],v);
			j+=(j&-j);
		}
		j=sj;
		i+=(i&-i);
	}
}

int g (int i,int j)
{
	int s=0,sj=j;
	while(i){
		while(j){
			s=max (s,t[i][j]);
			j-=(j&-j);
		}
		j=sj;
		i-=(i&-i);
	}

	return s;
}

int main()
{
	freopen ("cutii.in","r",stdin);
	freopen ("cutii.out","w",stdout);

	int n,teste;
	scanf ("%d%d",&n,&teste);

	while(teste--){
		memset (t,0,sizeof(t));
		memset (v,0,sizeof(v));

		for(int i=0;i<n;i++){
			int x,y,z;
			scanf ("%d%d%d",&x,&y,&z);

			v[i]=str (x,y,z);
		}

		sort (v,v+n);

		int r=0;
		for(int i=0;i<n;i++){
			int cr=g (v[i].y,v[i].z)+1;
			u (v[i].y,v[i].z,cr);

			if(cr>r)
				r=cr;
		}

		printf ("%d\n",r);
	}

	return 0;
}