Pagini recente » Cod sursa (job #1850728) | Cod sursa (job #1267039) | Cod sursa (job #1859124) | Cod sursa (job #1393472) | Cod sursa (job #814786)
Cod sursa(job #814786)
#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) {
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 ++key;
}
void citire(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() {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n, i, j, k;
citire(&n);
k = 0
for (i = 1; i <= n; i++) {
j = b_search(1, k, X[i]);
P[i] = X[j];
M[i] = j;
k = MAX(k, j + 1);
}
//fileout = fopen(argv[2], "w");
scriere(n, k);
//fclose(fileout);
myFree();
}