Pagini recente » Cod sursa (job #2558505) | Cod sursa (job #476135) | Cod sursa (job #393594) | Cod sursa (job #2773022) | Cod sursa (job #3200116)
#include <stdio.h>
#define MAX_N 100000
FILE *fin, *fout;
int v[MAX_N], s[MAX_N], pred[MAX_N];
inline int max(int a, int b) {
return a > b ? a : b;
}
int binarySearch(int searchValue, int left, int right) {
int i, step;
i = left - 1;
step = 1 << 16;
while (step) {
if (i + step <= right && v[s[i + step]] < searchValue)
i += step;
step >>= 1;
}
return i;
}
void write(int pos) {
if (pos != -1) {
write(pred[pos]);
fprintf(fout, "%d ", v[pos]);
}
}
int main() {
int n, i, length, maxLength;
fin = fopen("scmax.in", "r");
fscanf(fin, "%d", &n);
for (i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
fclose(fin);
maxLength = 0;
for (i = 0; i < n; ++i) {
length = binarySearch(v[i], 0, maxLength - 1) + 1;
s[length] = i;
pred[i] = length > 0 ? s[length - 1] : -1;
maxLength = max(maxLength, length + 1);
}
fout = fopen("scmax.out", "w");
fprintf(fout, "%d\n", maxLength);
write(s[maxLength - 1]);
fclose(fout);
return 0;
}