Cod sursa(job #90607)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 9 octombrie 2007 20:00:21
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

#define fin  "cutii.in"
#define fout "cutii.out"
#define Nmax 3501

struct box { int x,y,z; };

vector <box> v;
int N,T;
int ret,aib[Nmax][Nmax];

bool cmp(box a,box b)
{
	return a.x < b.x;
}

int query(int x,int y)
{
	int i,j,ret=0;
	for ( i=x ; i>0 ; i -= ( i & ~(i - 1) ) )
	for ( j=y ; j>0 ; j -= ( j & ~(j - 1) ) )
		ret = max(ret,aib[i][j]);
	return ret;
}

void update(int x,int y,int val)
{
	int i,j;

	for ( i=x ; i<=N ; i += ( i & ~(i - 1) ) )
	for ( j=y ; j<=N ; j += ( j & ~(j - 1) ) )
		aib[i][j]=max(aib[i][j],val);
}

void clear(int x,int y,int val)
{
	int i,j;

	for ( i=x ; i>0 ; i -= ( i & ~(i - 1) ) )
	for ( j=y ; j>0 ; j -= ( j & ~(j - 1) ) )
		aib[i][j]=val;
}

void solve()
{
	int i,curr;

	sort(v.begin(),v.end(),cmp);

	for (i=0;i<N;++i)
		clear(v[i].y,v[i].z,0);
	
	for (i=0;i<N;++i)
	{
		curr=query(v[i].y,v[i].z);
		++curr;
		ret=max(ret,curr);
		update(v[i].y,v[i].z,curr);
	}
}

void readdata()
{
	int i;
	box a;

	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);

	scanf("%d%d",&N,&T);

	for (;T>0;--T)
	{
		v.clear();
		for (i=0;i<N;++i)
		{
			scanf("%d%d%d",&a.x,&a.y,&a.z);
			v.push_back(a);
		}
		ret=0;
		solve();
		printf("%d\n",ret);
	}
	
}

int main()
{
	readdata();
	return 0;
}