Cod sursa(job #239380)

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


const short int MAX_N = 3500;

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

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

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

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(i))
			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;
	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)
		{
			int 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);
	}
}