Cod sursa(job #1148632)

Utilizator Kira96Denis Mita Kira96 Data 20 martie 2014 22:34:58
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<fstream>
#include<cstring>
#include<algorithm>
#define N 3600
#define x first
#define y second.first
#define z second.second
using namespace std;
ifstream f("cutii.in");
ofstream g("cutii.out");
pair<int,pair<int,int> > v[N];
int i,n,T,sol,a[5],A[N][N],be,pula,cs[N];
void upd(int X,int Y)
{
	for(;X<=n;X+=X&-X)
		for(;Y<=n;Y+=Y&-Y)
			A[X][Y]=max(A[X][Y],pula);
}
int find(int X,int Y)
{
	int sol=0;
	for(;X;X-=X&-X)
		for(;Y;Y-=Y&-Y)
			sol=max(sol,A[X][Y]);
	return sol;
}
int main ()
{
	f>>n>>T;
	while(T--)
	{
		for(i=1;i<=n;++i)
		{
			f>>a[1]>>a[2]>>a[3];
			sort(a+1,a+4);
			v[i].x=a[1]; v[i].y=a[2]; v[i].z=a[3];
		}
		sort(v+1,v+n+1);
		sol=0;
		for(i=1;i<=n;++i)
			memset(A[i],0,sizeof(A[i]));
		for(i=1;i<=n;++i)
		{
			be=i;
			while(v[i].x==v[i+1].x)
			{
				cs[i]=find(v[i].y-1,v[i].z-1)+1;
				if(cs[i]>sol)
					sol=cs[i];
				i++;
			}
			cs[i]=find(v[i].y-1,v[i].z-1)+1;
			if(cs[i]>sol)
				sol=cs[i];
			for(;be<=i;++be)
			{
				pula=cs[be];
				upd(v[be].y,v[be].z);
			}
		}
		g<<sol<<"\n";
	}
	return 0;
}