Pagini recente » Cod sursa (job #700493) | Cod sursa (job #492119) | Cod sursa (job #516578) | Cod sursa (job #1439710) | Cod sursa (job #823704)
Cod sursa(job #823704)
#include <stdio.h>
#include <stdlib.h>
int binary_search(int elem, int left, int right, int v[]){
int mid;
while(left <= right){
mid = (left + right) / 2;
if (v[mid] == elem)
return mid;
else
{
if(v[mid] < elem)
left = mid + 1;
else
right = mid - 1;
}
}
return left;
}
/*
int main(int argc, char *argv[]){
FILE *in = fopen(argv[1], "r");
FILE *out = fopen(argv[2], "w");
*/
int main()
{ freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n;
//fscanf(in, "%d", &n);
scanf("%d", &n);
int *price, *positions;
price = (int*) calloc(n, sizeof(int));
positions = (int*) malloc(n * sizeof(int));
int kiki[100001]; //!!!!
int i, j, aux, length, lmax, pos;
length = lmax = pos = j = 0;
for(i = 0; i < n; ++i){
//fscanf(in, "%d", &aux);
scanf("%d", &aux);
kiki[i] = aux;
pos = binary_search(aux, 0, length, price);
if(price[pos] == 0)
++length;
price[pos] = aux;
positions[j++] = pos;
if(pos > lmax)
lmax = pos;
}
int *result;
j = 0;
aux = lmax;
result = (int *) malloc(lmax);
for(i = n-1; i >= 0 && j < lmax; --i){
if(positions[i] == aux)
result[--aux] = i+1;
}
//!!!!!!!!!!!
printf("%d\n", lmax);
for(i = 0; i < lmax; ++i)
//fprintf(out, "%d ", result[i]);
//fprintf(out, "\n");
printf("%d ", kiki[result[i] - 1]);
printf("\n");
free(price);
free(positions);
free(result);
//fclose(in);
//fclose(out);
return 0;
}