Cod sursa(job #222409)

Utilizator CezarMocanCezar Mocan CezarMocan Data 22 noiembrie 2008 12:37:53
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAXN 350

using namespace std;

struct cutie {
	short int x, y, z;
};

short int n, t, i, j, aib[MAXN][MAXN], rez;
cutie v[MAXN];

bool cmp(cutie a, cutie b) {
	if (a.z < b.z) 
		return true;
	else
		return false;

}

void read() {
	short int i;
	memset(v, 0, sizeof(v));
	memset(aib, 0, sizeof(aib));
	rez = 0;

	for (i = 1; i <= n; i++)
		scanf("%hd%hd%hd", &v[i].x, &v[i].y, &v[i].z);

	sort(v + 1, v + n + 1, cmp);
}

inline short int lsb(short int x) {
	return ((x & (x - 1) ) ^ x);
}

short int query(short int x, short int y) {
	short int smax = 0, i, j;
	for (i = x; i > 0 ; i -= lsb(i))
		for (j = y; j > 0; j -= lsb(j))
			if (aib[i][j] > smax)
				smax = aib[i][j];
	return smax;
}

void update(short int x, short int y, short int up) {
	short int i, j;
	for (i = x; i <= n; i += lsb(i))
		for (j = y; j <= n; j += lsb(j))
			if (up > aib[i][j])
				aib[i][j] = up;
}

void solve() {
	short int i, mx;

	for (i = 1; i <= n; i++) {
		mx = query(v[i].x - 1, v[i].y - 1) + 1;
		if (mx > rez)
			rez = mx;
		update(v[i].x, v[i].y, mx);
//		fprintf(stderr, "%d\n", mx);
	}

}

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

	scanf("%hd%hd", &n, &t);
	
//	fprintf(stderr, "%d\n", n);
	for (i = 1; i <= t; i++) {
		read();
		solve();
//		fprintf(stderr, "%d\n", n);
		printf("%hd\n", rez);
	}

	return 0;
}