Cod sursa(job #287988)

Utilizator blasterzMircea Dima blasterz Data 25 martie 2009 13:57:49
Problema Cutii Scor 0
Compilator cpp Status done
Runda aa Marime 1.53 kb
#include <cstdio>
#include <cstdlib>
#include <string>
#include <algorithm>

using namespace std;

struct nod
{
	short x, y, z;
	
};

struct cmp{
	bool operator()(const nod &a, const nod &b)const
	{
		if(a.x < b.x) return 1;
		return 0;
	}
};

nod a[3501];
short dp[3501];
int n, T;
short aib[3501][3501];

inline void update(short x,short y, short v)
{
	for(int i=x; i <= n; i += i & -i) 
		for(int j=y; j <= n; j += j & -j)
			aib[i][j] = max(aib[i][j], v);
}

inline void update2(short x, short y, short v)
{
	for(int i=x; i <= n; i += i & -i)
		for(int j=y; j <= n; j += j & -j)
			aib[i][j]=v;
}

inline int query(short x, short y)
{
	short v=0;
	for(int i=x; i ; i -= i & -i)
		for(int j=y; j ; j -= j & -j)
		{
		//	printf("_%d\n",aib[i][j]);
			v=max(v, aib[i][j]);
		}
	return v;
}

void solve()
{
	int i, j;
	for(i=0; i <= n; ++i) dp[i]=0;
//	memset(aib, 0,sizeof(aib));
	dp[1]=1;
	update(a[1].x, a[1].y, 1);
	int mx=1;
	for(i=2; i <= n;++i)
	{
		dp[i] = 1 + query(a[i].x, a[i].y);
		
		if(a[i].x == a[i-1].x) ;
		else 
		update(a[i].x, a[i].y, dp[i]);
		
		if(dp[i] > mx) mx=dp[i];
	}
	
	for(i=1; i <= n; ++i) update2(a[i].x, a[i].y, 0);
	printf("%d\n",mx);
	
	
}
int main()
{
	freopen("cutii.in","r",stdin);
	freopen("cutii.out","w",stdout);
	scanf("%d %d\n", &n, &T);
	
	//memset(aib, 0, sizeof(aib));
	int i;
	while(T--)
	{
		for(i=1;i <= n; ++i) scanf("%d %d %d\n", &a[i].x, &a[i].y, &a[i].z);
		sort(a+1,a+n+1,cmp());
		solve();
		
	}
	
	
	
	return 0;
}