Cod sursa(job #476781)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 12 august 2010 13:02:50
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <stdio.h>
#include <algorithm>
#define Nmax 3502

using namespace std;

int C[Nmax][Nmax];
int X[Nmax],Y[Nmax],Z[Nmax],ind[Nmax];
int n,t;

inline int Maxim(int x,int y){ return x>y ? x:y; }
inline int cmp(int i,int j){
	return Z[i] < Z[j];
}

inline int caut(int x,int y){
	int zeroy,zerox,aux,rez=0;
	zerox=0;
	
	while( x >= 1 ){
		
		aux=y; zeroy=0;
		while( aux >= 1 ){
			rez=Maxim(C[x][aux],rez);
			while( ! ( aux & (1<<zeroy) ) ) ++zeroy;
			aux -= (1<<zeroy);
		}
		
		while( ! ( x & (1<<zerox) ) ) ++zerox;
		x -= (1<<zerox);
	}
	return rez;
}	

inline void add(int x,int y){
	int mx,zeroy,zerox,aux;
	mx = caut(x-1,y-1);
	zerox=0;
	
	while( x <= n ){
		
		aux=y; zeroy=0;
		while( aux <= n ){
			C[x][aux]=Maxim(C[x][aux],mx+1);
			while( ! ( aux & (1<<zeroy) ) ) ++zeroy;
			aux += (1<<zeroy);
		}
		
		while( ! ( x & (1<<zerox) ) ) ++zerox;
		x += (1<<zerox);
	}
}

inline void erase(int x,int y){
	int zeroy,zerox,aux;
	zerox=0;
	
	while( x <= n ){
		
		aux=y; zeroy=0;
		while( aux <= n ){
			C[x][aux]=0;
			while( ! ( aux & (1<<zeroy) ) ) ++zeroy;
			aux += (1<<zeroy);
		}
		
		while( ! ( x & (1<<zerox) ) ) ++zerox;
		x += (1<<zerox);
	}
}

int main(){
	int i,rez;
	freopen("cutii.in","r",stdin);
	freopen("cutii.out","w",stdout);
	scanf("%d%d",&n,&t);
	for( ; t; --t){
		for(i=1;i<=n;++i) scanf("%d%d%d",&X[i],&Y[i],&Z[i]),ind[i]=i;
		sort(ind+1,ind+n+1,cmp);
		
		for(i=1;i<=n;++i)
			add(X[ind[i]],Y[ind[i]]);
		
		rez=caut(n,n);
		printf("%d\n",rez);
		
		for(i=1;i<=n;++i) erase(X[ind[i]],Y[ind[i]]);
	}
	
	fclose(stdin); fclose(stdout);
	return 0;
}