Pagini recente » Cod sursa (job #888701) | Cod sursa (job #2624230) | Cod sursa (job #1437506) | Cod sursa (job #1445037) | Cod sursa (job #2695182)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100000
int v[NMAX], ind[NMAX], pred[NMAX], out[NMAX];
int cautare(int e, int n){
int min, max, mij;
min = 0;
max = n;
while((max - min) > 1){
mij = (min + max) / 2;
if(e < v[ind[mij]]){
max = mij;
}else{
min = mij;
}
}
return min;
}
int main()
{
FILE *fin, *fout;
int n, i, j, lim, retval;
fin = fopen("scmax.in", "r");
fscanf(fin, "%d", &n);
for(i = 0; i < n; i++){
pred[i] = -1;
}
lim = 0;
for(i = 0; i < n; i++){
fscanf(fin, "%d", &v[i]);
retval = cautare(v[i], lim);
if(v[i] <= v[ind[retval]]){
retval--;
}
ind[retval + 1] = i;
if(lim == (retval + 1)){
lim++;
}
if(0 <= retval){
pred[i] = ind[retval];
}
}
fclose(fin);
fout = fopen("scmax.out", "w");
fprintf(fout, "%d\n", lim);
i = ind[lim - 1];
j = lim - 1;
while(-1 < i){
out[j] = v[i];
j--;
i = pred[i];
}
for(j = 0; j < lim; j++){
fprintf(fout, "%d ", out[j]);
}
fclose(fout);
return 0;
}