Cod sursa(job #495581)

Utilizator ilincaSorescu Ilinca ilinca Data 25 octombrie 2010 20:54:18
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 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, 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 a, int b)
{
	int i, j, k=0;
	for (i=a; i >= 1; i -= p0 (i))
		for (j=b; j >= 1; j -= p0 (j))
			k=max (k, aib [i] [j]);
	return k;
}

void update (int a, int b, int v)
{
	int i, j;
	for (i=a; i <= n; i += p0 (i))
		for (j=b; j <= n; j += p0 (j))
			aib [i] [j]=max (v, aib [i] [j]);
}

void init ()
{
	int i, j, k;
	for (i=1; i <= n; ++i)
		for (j=v [i].y; j <= n; j += p0 (j))
			for (k=v [i].z; k <= n; k += p0 (k))
				aib [j] [k]=0;
}

int solve ()
{
	sort (v+1, v+n+1);
	int i, a, m=0;
	for (i=1; i <= n; ++i)
	{
		a=query (v [i].y, v [i].z)+1;
		update (v [i].y, v [i].z, a);
		m=max (m, a);
	}
	init ();
	return m;
}

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);
		printf ("%d\n", solve());
	}
	return 0;
}