Pagini recente » Cod sursa (job #1301954) | Cod sursa (job #974293) | Cod sursa (job #1937763) | Cod sursa (job #1270948) | Cod sursa (job #1823118)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int *v, *q, *p;
int bs(int st, int dr, int val) {
int last = 0, med;
while(st <= dr) {
med = (st + dr) / 2;
if(q[med] < val) {
last = med;
st = med + 1;
} else {
dr = med - 1;
}
}
return last + 1;
}
int main()
{
int n, i, st = 1, dr = 0, aux;
FILE *f = fopen("scmax.in", "r");
FILE *g = fopen("scmax.out", "w");
fscanf(f,"%d\n",&n);
v = (int*)malloc((n+1)*sizeof(int));
q = (int*)malloc((n+1)*sizeof(int));
p = (int*)malloc((n+1)*sizeof(int));
for(i = 0; i < n; i++) {
fscanf(f,"%d ",&v[i]);
aux = bs(st, dr, v[i]);
if(aux == dr + 1)
++dr;
q[aux] = v[i];
p[i] = aux;
}
fprintf(g, "%d\n", dr);
aux = dr;
for (i = n; i >= 1; i--)
if (p[i] == aux) {
q[aux] = v[i];
--aux;
}
for (i = 1; i <= dr; i++) {
fprintf(g, "%d ", q[i]);
}
fprintf(g, "\n");
fclose(f);
fclose(g);
free(v);
free(q);
free(p);
return 0;
}