Pagini recente » Cod sursa (job #2142858) | Cod sursa (job #318071) | Cod sursa (job #2566932) | Cod sursa (job #2228233) | Cod sursa (job #489104)
Cod sursa(job #489104)
#include <stdio.h>
#define NMAX 100000
#define infile "scmax.in"
#define outfile "scmax.out"
int s[NMAX], n, vals[NMAX], ll, tata[NMAX];
FILE *f;
void read_data() {
FILE *fis = fopen(infile, "r");
int i;
fscanf(fis, "%d", &n);
for (i = 0; i < n; i++)
fscanf(fis, "%d", &s[i]);
fclose(fis);
}
//returns a position
int binary_search(int nr) {
int left, right, m;
left = 0;
right = ll;
while (left <= right) {
m = (right + left) / 2;
//if (vals[m] <= nr)
if (s[vals[m]] < nr)
left = m + 1;
else
right = m - 1;
}
return left;
}
void write_data(int k) {
if (tata[k] == -1) {
fprintf(f, "%d ", s[k]);
return;
}
write_data(tata[k]);
fprintf(f, "%d ", s[k]);
}
int main() {
int i, pos;
read_data();
vals[0] = 0;
tata[0] = -1;
ll = 0;
for (i = 1; i < n; i++) {
pos = binary_search(s[i]);
if (pos == 0)
tata[i] = -1;
else
tata[i] = vals[pos - 1];
if (pos == ll + 1) {
ll++;
vals[ll] = i;
} else {
vals[pos] = i;
}
}
f = fopen(outfile, "w");
fprintf(f, "%d\n", ll+1);
write_data(vals[ll]);
fprintf(f, "\n");
fclose(f);
return 0;
}