Cod sursa(job #810158)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 9 noiembrie 2012 19:25:56
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb

#include <cstdio>

const int MAX_SIZE(3501);

int n;

int boxes [MAX_SIZE] [2];
int bit [MAX_SIZE] [MAX_SIZE];

inline void read (void)
{
	int x, y, z;
	for (int i(1) ; i <= n ; ++i)
	{
		std::scanf("%d%d%d",&x,&y,&z);
		boxes[x][0] = y;
		boxes[x][1] = z;
	}
}

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

inline int query (int x, int y)
{
	int i, j, max(0);
	for (i = x ; i ; i -= lsb(i))
		for (j = y ; j ; j-= lsb(j))
			if (bit[i][j] > max)
				max = bit[i][j];
	return max;
}

inline void update (int x, int y, int length)
{
	int i, j;
	for (i = x ; i <= n ; i += lsb(i))
		for (j = y ; j <= n ; j += lsb(x))
			if (length > bit[i][j])
				bit[i][j] = length;
}

inline int maximum_incresing_substring (void)
{
	int max(0), length;
	for (int i(1) ; i <= n ; ++i)
	{
		length = query(boxes[i][0] - 1,boxes[i][1] - 1) + 1;
		update(boxes[i][0],boxes[i][1],length);
		if (length > max)
			max = length;
	}
	return max;
}

inline void clear_tree (void)
{
	int x, y, z;
	for (x = 1 ; x <= n ; ++x)
		for (y = boxes[x][0] ; y <= n ; y += lsb(y))
			for (z = boxes[x][1] ; z <= n ; z += lsb(z))
				bit[y][z] = 0;
}

int main (void)
{
	std::freopen("cutii.in","r",stdin);
	std::freopen("cutii.out","w",stdout);
	int t;
	std::scanf("%d%d",&n,&t);
	while (true)
	{
		read();
		std::printf("%d\n",maximum_incresing_substring());
		--t;
		if (t)
			clear_tree();
		else
			break;
	}
	std::fclose(stdin);
	std::fclose(stdout);
	return 0;
}