Pagini recente » Cod sursa (job #918972) | Cod sursa (job #1974522) | Cod sursa (job #1762861) | Cod sursa (job #564578) | Cod sursa (job #814784)
Cod sursa(job #814784)
#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();
}