Cod sursa(job #632565)

Utilizator ChallengeMurtaza Alexandru Challenge Data 11 noiembrie 2011 17:07:47
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <algorithm>

using namespace std;

const char InFile[]="cutii.in";
const char OutFile[]="cutii.out";
const int MaxN=4096;

ifstream fin(InFile);
ofstream fout(OutFile);

struct Cutie
{
	int X,Y,Z;
};

struct Cutie_cmp
{
	inline bool operator() (const Cutie &a, const Cutie &b)
	{
		return a.Z<b.Z;
	}
};

int N,T,sol,AIB2D[MaxN][MaxN];
Cutie c[MaxN];

inline int LSB(const int &x)
{
	return x&(-x);
}

inline int AIB2DQuery(const int &x, const int &y)
{
	int sol=0;
	for(register int i=x;i>0;i-=LSB(i))
	{
		for(register int j=y;j>0;j-=LSB(j))
		{
			sol=max(AIB2D[i][j],sol);
		}
	}
	return sol;
}

inline void AIB2DUpdate(const int &x, const int &y, const int &val)
{
	for(register int i=x;i<=N;i+=LSB(i))
	{
		for(register int j=y;j<=N;j+=LSB(j))
		{
			AIB2D[i][j]=max(AIB2D[i][j],val);
		}
	}
}

inline void AIB2DSet0(const int &x, const int &y)
{
	for(register int i=x;i<=N;i+=LSB(i))
	{
		for(register int j=y;j<=N;j+=LSB(j))
		{
			AIB2D[i][j]=0;
		}
	}
}

int main()
{
	fin>>N>>T;
	for(;T;--T)
	{
		sol=0;
		for(register int i=1;i<=N;++i)
		{
			fin>>c[i].X>>c[i].Y>>c[i].Z;
		}
		sort(c+1,c+1+N,Cutie_cmp());
		for(register int i=1;i<=N;++i)
		{
			int best=1+AIB2DQuery(c[i].X-1,c[i].Y-1);
			sol=max(sol,best);
			AIB2DUpdate(c[i].X,c[i].Y,best);
		}
		/*for(register int i=1;i<=N;++i)
		{
			AIB2DSet0(c[i].X,c[i].Y);
		}*/
		fout<<sol<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}