Cod sursa(job #632587)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 11 noiembrie 2011 18:30:36
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>
#include<algorithm>

#define maxn 3505

using namespace std;

FILE*f=fopen("cutii.in","r");
FILE*g=fopen("cutii.out","w");

int n,t,i,j,best;
short int aib[maxn][maxn],D[maxn];

struct cutie{
	int x,y,z;
}A[maxn];

struct cmp{
	inline bool operator () ( const cutie &a , const cutie &b ){
		return a.x < b.x;
	}
};

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

inline void update_aib2D ( int x , int y , int val ){
	
	for ( ; x <= n ; x += lsb(x) ){
		for ( ; y <= n ; y += lsb(y) ){
			if ( val > aib[x][y] )
				aib[x][y] = val;
		}
	}
}

inline int query_aib2D ( int x , int y ){
	int bst = 0;
	
	for ( ; x > 0 ; x -= lsb(x) ){
		for ( ; y > 0 ; y -= lsb(y) ){
			if ( aib[x][y] > bst )
				bst = aib[x][y];
		}
	}
	
	return bst;
}

int solve () {
	
	for ( i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d %d %d",&A[i].x,&A[i].y,&A[i].z);
		for ( j = 1 ; j <= n ; ++j ){
			aib[i][j] = 0;
		}
	}
	sort(A+1,A+n+1,cmp());
	
	for ( i = 1 ; i <= n ; ++i ){
		D[i] = query_aib2D(A[i].y-1,A[i].z-1) + 1;
		update_aib2D(A[i].y,A[i].z,D[i]);
	}
	
	best = 0;
	for ( i = 1 ; i <= n ; ++i ){
		if ( D[i] > best ){
			best = D[i];
		}
	}
	
	return best; 
}

int main () {
	
	fscanf(f,"%d %d",&n,&t);
	for ( int i = 1 ; i <= t ; ++i ){
		fprintf(g,"%d\n",solve());
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}