Cod sursa(job #3706)

Utilizator MariusMarius Stroe Marius Data 27 decembrie 2006 23:38:49
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <memory>
using namespace std;

const char iname[] = "cutii.in";
const char oname[] = "cutii.out";

#define MAX_N 3501

#define ultbit(x) ((x) & ((x) ^ (x-1)))

int N, T;

int x[MAX_N], y[MAX_N], z[MAX_N];

int A[MAX_N][MAX_N];

int X[MAX_N];


void update(int x, int y, int best)
{
	for (int i = x; i <= N; i += ultbit(i))
		for (int j = y; j <= N; j += ultbit(j)) {
			if (best == 0)
				A[i][j] = best;
			else if (A[i][j] < best)
				A[i][j] = best;
		}
}

int  query(int x, int y)
{
	int m = 0;

	for (int i = x; i; i -= ultbit(i))
		for (int j = y; j; j -= ultbit(j))
			if (m < A[i][j])  m = A[i][j];
	return m;
}

void sort(void)
{
	int cnt[MAX_N];
	int i;

	memset(cnt, 0, sizeof(cnt));
	for (i = 1; i <= N; ++i)
		++cnt[ z[i] ];
	for (i = 2; i <= N; ++i)
		cnt[i] += cnt[i - 1];
	for (i = N; i; --i)
		X[ cnt[ z[i] ]-- ] = i;
}

int  main(void)
{
	int i;
	int best, temp;
	freopen(iname, "r", stdin);
	freopen(oname, "w", stdout);

	scanf("%d %d\n", &N, &T);
	for (; T--;) {
		for (i = 1; i <= N; ++i)
			scanf("%d %d %d\n", x+i, y+i, z+i);
		sort();
		for (best = 0, i = 1; i <= N; ++i) {
			temp = query(x[ X[i] ] - 1, y[ X[i] ] - 1) + 1;
			update(x[ X[i] ], y[ X[i] ], temp);
			if (best < temp)
				best = temp;
		}
		printf("%d\n", best);

		for (i = 1; i <= N; ++i)
			update(x[ X[i] ], y[ X[i] ], 0);
	}
	
	return 0;
}