Cod sursa(job #732300)

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

inline void Precalculare_Biti_Terminali()
{
	int i;
	for(i=1;i<=n;i++)
		bit[i]=(i & -i);
}

inline int Max(int a,int b)
{
	if(a<b)
		return b;
	return a;
}

inline bool Sortare(Cutie A,Cutie B)
{
	return A.x<B.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;
	Precalculare_Biti_Terminali();
	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;
}