Cod sursa(job #495556)

Utilizator ilincaSorescu Ilinca ilinca Data 25 octombrie 2010 19:58:57
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

#define nmax 3505
#define x first
#define y second.first
#define z second.second

using namespace std;

typedef pair <int, pair <int, int> > iii;
int n, a [nmax], aib [nmax] [nmax];
iii v [nmax];

inline int p0 (int a)
{return a^(a & (a-1));}

inline int max (int a, int b)
{return (a>b)? a:b;}

int query (int n, int m)
{
	int i, j, k=0;
	for (i=1; i <= n; i += p0 (i))
		for (j=1; j <= m; j += p0 (j))
			k=max (k, aib [i] [j]);
	return k;
}

void update (int n, int m, int v)
{
	int i, j;
	for (i=n; i >= 1; i -= p0 (i))
		for (j=m; j >= 1; j -= p0 (j))
			aib [i] [j]=v;
}

void solve ()
{
	memset (aib, 0, sizeof (aib));
	sort (v+1, v+n+1);
	int i;
	for (i=1; i <= n; ++i)
	{
		a [i]=query (v [i].y, v [i].z)+1;
		update (v [i].y, v [i].z, a [i]);
	}
}

int main ()
{
	freopen ("cutii.in", "r", stdin);
	freopen ("cutii.out", "w", stdout);
	int i, j, t;
	scanf ("%d%d", &n, &t);
	for (i=1; i <= t; ++i)
	{
		for (j=1; j <= n; ++j) scanf ("%d%d%d", &v [j].x, &v [j].y, &v [j].z);
		solve ();
		printf ("%d\n", a [n]);
	}
	return 0;
}