Cod sursa(job #643484)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 3 decembrie 2011 19:17:17
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

#define file_in "cutii.in"
#define file_out "cutii.out"

#define lsb(x) ((x)&(-(x)))

#define nmax 3511

struct cutie{
	int x,y,z;
}p[nmax];
int Aib[nmax][nmax];
int N,T;

int cmp(cutie a, cutie b){
	
	return a.x<b.x;
}

void add(int poz1, int poz2, int val){
	
	int i,j;
	for (i=poz1;i<=N;i+=lsb(i))
		 for (j=poz2;j<=N;j+=lsb(j))
			  Aib[i][j]=max(Aib[i][j],val);
}

int sol(int poz1, int poz2){
	
	int i,j,ans=0;
	for (i=poz1;i>=1;i-=lsb(i))
		 for (j=poz2;j>=1;j-=lsb(j))
			  ans=max(ans,Aib[i][j]);
	return ans;
}	

void goleste(int poz1, int poz2, int val){
	
	int i,j;
	for (i=poz1;i<=N;i+=lsb(i))
		 for (j=poz2;j<=N;j+=lsb(j))
			  Aib[i][j]=val;
}

int main(){
	
	int i,ans;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &N, &T);
	
	while(T--){
		
		//memset(Aib,0,sizeof(Aib));
		
		for (i=1;i<=N;++i)
			 scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].z);
		sort(p+1,p+N+1,cmp);
		ans=0;
		for (i=1;i<=N;++i){
			int X=sol(p[i].y-1,p[i].z-1)+1;
			ans=max(ans,X);
			add(p[i].y,p[i].z,X);
		}
		for(i=1;i<=N;++i)
		    goleste(p[i].y,p[i].z,0);
		printf("%d\n", ans);
	}
	
	return 0;
}