Cod sursa(job #93460)

Utilizator hellraizerChiperi Matei hellraizer Data 18 octombrie 2007 20:53:10
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_MAX 3501

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

int N,T,V[N_MAX][N_MAX];

int cmp(const void *i, const void *j){
	cutie *ei= (cutie *) i;
	cutie *ej= (cutie *) j;
	return ei->x - ej->x;
}

int bit (int x){
	return (x&(x-1))^x;
}

int maxim(int x,int y){
	int i,j,max=0;
	for (i=x;i>0;i-=bit(i))
		for (j=y;j>0;j-=bit(j))
			if (V[i][j]>max)
				max=V[i][j];
	return max;
}

void adauga(int x, int y, int z){
	int i,j,max;
	max=maxim(x,y);
	V[x][y]=++max;
	for (i=x;i<=N;i+=bit(i))
		for (j=y;j<=N;j+=bit(j)){
			if (V[i][j]<max)
				V[i][j]=max;
		}
}

void clear(int x,int y){
	int i,j;
	for (i=x;i<=N;i+=bit(i))
		for (j=y;j<=N;j+=bit(j))
			if (V[i][j])
				V[i][j]=0;
			else
				break;
}

int main(){
	int k,i,max,s;
	FILE *fin=fopen("cutii.in","r");
	FILE *fout=fopen("cutii.out","w");
	fscanf(fin,"%d %d",&N,&T);
	for (k=1;k<=T;k++){
		for (i=0;i<N;i++)	
			fscanf(fin,"%d %d %d",&A[i].x,&A[i].y,&A[i].z);
		qsort(A,N,sizeof(cutie),cmp);
		max=0;
		for (i=0;i<N;i++){
			adauga(A[i].y,A[i].z,1);
			s=maxim(A[i].y,A[i].z);
			if (s>max)
				max=s;
		}
		for (i=0;i<N;i++)
			clear(A[i].y,A[i].z);
		fprintf(fout,"%d\n",max);
		
	}
	fclose(fin);
	fclose(fout);
	return 0;
}