Cod sursa(job #239421)

Utilizator raduzerRadu Zernoveanu raduzer Data 4 ianuarie 2009 19:10:42
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAX_N = 3500;

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

short int n, t, i, j;
short int aib[MAX_N][MAX_N], sol;
cutie a[MAX_N];

bool cmp(cutie a, cutie b) 
{
	return a.z < b.z;
}

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

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

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

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

	scanf("%hd%hd", &n, &t);
	
	for (; t; --t) 
	{
		memset(a, 0, sizeof(a));
		memset(aib, 0, sizeof(aib));
		
		sol = 0;
	
		for (i = 1; i <= n; i++)
			scanf("%hd%hd%hd", &a[i].x, &a[i].y, &a[i].z);
	
		sort(a + 1, a + n + 1, cmp);
		
		for (i = 1; i <= n; i++) 
		{
			k = query(a[i].x - 1, a[i].y - 1) + 1;
			if (k > sol) sol = k;
			
			update(a[i].x, a[i].y, k);
		}
		
		printf("%hd\n", sol);
	}
}