Pagini recente » Cod sursa (job #1140174) | Cod sursa (job #1740797) | Cod sursa (job #2322257) | Cod sursa (job #2438142) | Cod sursa (job #823383)
Cod sursa(job #823383)
#include <stdio.h>
#include <stdlib.h>
int binary_search(int x, int V[], int low, int high, int mid) {
if(low <= high) {
mid = (low + high) / 2;
if(x == V[mid])
return mid;
if(x < V[mid])
return binary_search(x, V, low, mid - 1, mid);
else
return binary_search(x, V, mid + 1, high, mid);
}
else
return low;
}
int main() {
FILE *input = fopen("scmax.in", "r");
FILE *output = fopen("scmax.out", "w");
int n;
fscanf(input, "%d", &n);
int *V = malloc(n * sizeof(int));
int i, poz, nr = 0, k = 1, mid = 0;
for(i = 0; i < n; i++)
fscanf(input, "%d", &V[i]);
fclose(input);
int *P = calloc(n, sizeof(int));
int *Q = calloc(n, sizeof(int));
Q[0] = V[0];
P[0] = 0;
for(i = 1; i < n; i++) {
poz = binary_search(V[i], Q, 0, nr, mid);
if(poz > nr) {
nr++;
Q[nr] = V[i];
}
else
Q[poz] = V[i];
P[k++] = poz;
}
fprintf(output, "%d\n", nr + 1);
int copie = nr;
for(i = n - 1; i >= 0; i--) {
if(P[i] == copie) {
Q[copie] = i;
copie --;
}
}
for(i = 0; i <= nr; i++)
fprintf(output, "%d ", V[Q[i]]);
fclose(output);
free(V);
free(P);
free(Q);
return 0;
}