Cod sursa(job #483522)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 8 septembrie 2010 23:49:03
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>

#define maxN 3505

using namespace std;

struct box {
	int x, y, z;
} B[maxN];
int AIB[maxN][maxN], N, T;

inline bool cmp (const box &a, const box &b)
{
	return a.z < b.z;
}
int query (int x, int y)
{	
	int S = 0, yy = y;
	for (; x > 0; x -= (x & -x))
		for (y = yy; y > 0; y -= (y & -y))
			S = (S < AIB[x][y]) ? AIB[x][y] : S;
	return S;
}
void update (int x, int y, int val)
{	
	int yy = y;
	for (; x <= N; x += (x & -x))
		for (y = yy; y <= N; y += (y & -y))
			if (AIB[x][y] < val)
				AIB[x][y] = val;
}
void erase (int x, int y)
{	
	int yy = y;
	for (; x <= N; x += (x & -x))
		for (y = yy; y <= N; y += (y & -y))
			AIB[x][y] = 0;
}
int main () 
{

	freopen ("cutii.in", "r", stdin);
	freopen ("cutii.out", "w", stdout);
	
	int i, mx, Mx;
	scanf ("%d%d\n", &N, &T);

	while (T--) {

		for (i = 1; i <= N; i++)
			scanf ("%d%d%d\n", &B[i].x, &B[i].y, &B[i].z);
		
		sort (B + 1, B + N + 1, cmp);
		
		Mx = 0;
		for (i = 1; i <= N; i++) {

			mx = query (B[i].x, B[i].y) + 1;
			update (B[i].x, B[i].y, mx);

			if (mx > Mx) Mx = mx;
		}
		printf ("%d\n", Mx);
		for (i = 1; i <= N; i++)
			erase (B[i].x, B[i].y);
	}
	return 0;
}