Cod sursa(job #814784)

Utilizator catalin.ichimovIchimov Catalin Florin catalin.ichimov Data 16 noiembrie 2012 04:03:12
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX(a, b)  (((a) > (b)) ? (a) : (b))

int *X, *M, *P;
//FILE *fileout, *filein;


int b_search(int st,int dr,int key, int k) {
    while (dr >= st) {
        int mid = (st + dr) / 2;
		if(P[mid] >= key && P[mid-1] < key)
			return mid;
		if(P[mid] < key)		     
			st = mid + 1;
  		else
			dr = mid - 1;
    }
    return ++k;
}

void citire(char *fis, int *n) {
	int i, aux;
	//filein = fopen(fis, "r");
	scanf("%d", &aux);
	X = (int *) malloc (aux * sizeof(int));	
	for(i = 1; i <= aux; i++)	
		scanf("%d", &X[i]);
	*n = aux;	
	//fclose(filein);
}

void scriere(int i, int k) {
	
	if (k > 0) {
    	if (M[i]==k)  {
			scriere(i - 1, k - 1);
        	printf("%d ", X[i]);
		} else
			scriere(i - 1, k);
    }     
}

void myFree() {
	free(X);
	free(M);
	free(P);
}

int main(int args, char *argv[]) {
	
	freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
	int n, i, j, k;	
	citire(argv[1], &n);

 	for (i = 1; i <= n; i++) {
		j = b_search(1, k, X[i], k);
        P[i] = M[j];
		M[j + 1] = i;
		k = MAX(k, j + 1);
	}	
	//fileout = fopen(argv[2], "w");
	scriere(n, k);    
	//fclose(fileout);
	myFree();
}