Cod sursa(job #732298)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 10 aprilie 2012 10:02:46
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,T,aib[3550][3550];
struct Cutie{int x,y,z;};
Cutie A[3550];

inline bool Sortare(Cutie A,Cutie B)
{
	return A.x<B.x;
}

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

inline int Query(int x,int y)
{
	int i,j,rez=0;
	for(i=x;i>0;i-=Bit(i))
		for(j=y;j>0;j-=Bit(j))
			rez=max(rez,aib[i][j]);
	return rez;
}

inline void Update(int x,int y,int val)
{
	int i,j;
	for(i=x;i<=n;i+=Bit(i))
		for(j=y;j<=n;j+=Bit(j))
			aib[i][j]=max(aib[i][j],val);
}

inline void Memset_Aib(int x,int y)
{
	int i,j;
	for(i=x;i<=n;i+=Bit(i))
		for(j=y;j<=n;j+=Bit(j))
			aib[i][j]=0;
}

inline int Rezolvare()
{
	sort(A+1,A+n+1,Sortare);
	int i,best=0,val;
	for(i=1;i<=n;i++)
	{
		val=1+Query(A[i].y-1,A[i].z-1);
		Update(A[i].y,A[i].z,val);
		best=max(best,val);
	}
	for(i=1;i<=n;i++)
		Memset_Aib(A[i].y,A[i].z);
	return best;
}

int main()
{
	int t,i;
	ifstream fin("cutii.in");
	ofstream fout("cutii.out");
	fin>>n>>T;
	for(t=0;t<T;t++)
	{
		for(i=1;i<=n;i++)
			fin>>A[i].x>>A[i].y>>A[i].z;
		fout<<Rezolvare()<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}