Cod sursa(job #303809)

Utilizator ProtomanAndrei Purice Protoman Data 10 aprilie 2009 13:42:05
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <algorithm>
#include <stdio.h>

#define bitAib(x) ((x & (x - 1)) ^ x)
#define MAX 3510
#define f first
#define s second

using namespace std;

pair <int, pair <int, int> > vctDim[MAX];
short aib2D[MAX][MAX];
int n, testCases;

inline void updateAib(int x, int y, short key)
{
	for (int i = x; i <= n; i += bitAib(i))
		for (int j = y; j <= n; j += bitAib(j))
			aib2D[i][j] = max(aib2D[i][j], key);
}

inline void clearAib(int x, int y)
{
	for (int i = x; i <= n; i += bitAib(i))
		for (int j = y; j <= n; j += bitAib(j))
			aib2D[i][j] = 0;
}

inline int queryAib(int x, int y)
{
	short maxGs = 0;

	for (int i = x; i; i -= bitAib(i))
		for (int j = y; j; j -= bitAib(j))
			maxGs = max(maxGs, aib2D[i][j]);

	return maxGs;
}
			

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

	for (scanf("%d %d", &n, &testCases); testCases; testCases--)
	{
		for (int i = 1; i <= n; i++)
			scanf("%d %d %d", &vctDim[i].f, &vctDim[i].s.f, &vctDim[i].s.s);

		sort(vctDim + 1, vctDim + 1 + n);

		short maxGs = 0;
		for (int i = 1; i <= n; i++)
		{
			short sol = queryAib(vctDim[i].s.f, vctDim[i].s.s) + 1;
			maxGs = max(maxGs, sol);

			updateAib(vctDim[i].s.f, vctDim[i].s.s, sol);
		}

		for (int i = 1; i <= n; i++)
			clearAib(vctDim[i].s.f, vctDim[i].s.s);

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

	fclose(stdin);
	fclose(stdout);
	return 0;
}