Cod sursa(job #805004)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 30 octombrie 2012 20:03:38
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb

#include <cstdio>
#include <cstdlib>
#include <ctime>

const int MAX_SIZE(3500);
const int DIMENSIONS(3);

int n, t;

int boxes [MAX_SIZE] [DIMENSIONS];
int sorted [MAX_SIZE];
int substring [MAX_SIZE];

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

inline int cmp (int a, int b)
{
	for (int i(0) ; i < DIMENSIONS ; ++i)
		if (boxes[a][i] < boxes[b][i])
			return -1;
		else if (boxes[a][i] > boxes[b][i])
			return 1;
	return 0;
}

void quicksort (int left, int right)
{
	int pivot(sorted[left + (rand() % (right - left + 1))]), i(left), j(right), temp;
	while (i <= j)
	{
		while (cmp(sorted[i],pivot) < 0)
			++i;
		while (cmp(sorted[j],pivot) > 0)
			--j;
		if (i <= j)
		{
			temp = sorted[i];
			sorted[i] = sorted[j];
			sorted[j] = temp;
			++i;
			--j;
		}
	}
	if (left < j)
		quicksort(left,j);
	if (right > i)
		quicksort(i,right);
}

inline int maximal_substring (int begin, int end)
{
	*substring = 0;
	int j(1), left, right, middle;
	for (int i(1) ; i < end ; ++i)
	{
		if (cmp(sorted[i],sorted[substring[j]]) > 0)
		{
			substring[j] = i;
			++j;
		}
		else
		{
			left = 0;
			right = j - 1;
			middle = (left + right) >> 1;
			while (left < right)
			{
				if (cmp(sorted[i],sorted[substring[middle]]) < 0)
					left = middle + 1;
				else
					right = middle;
				middle = (left + right) >> 1;
			}
			if (cmp(sorted[i],sorted[substring[middle]]) < 0)
				substring[middle] = i;
		}
	}
	return j;
}

int main (void)
{
	std::srand(std::time(0));
	std::freopen("cutii.in","r",stdin);
	std::freopen("cutii.out","w",stdout);
	std::scanf("%d%d",&n,&t);
	do
	{
		read();
		quicksort(0,n - 1);
		std::printf("%d\n",maximal_substring(0,n));
		--t;
	}
	while (t);
	std::fclose(stdin);
	std::fclose(stdout);
	return 0;
}