Pagini recente » Cod sursa (job #2138484) | Cod sursa (job #2698322) | Cod sursa (job #1135100) | Cod sursa (job #886067) | Cod sursa (job #1947478)
#include <stdio.h>
#define NMAX 100010
int N, vN[NMAX], pos[NMAX], buffer[NMAX], left, right, max = -1, pMax, ans[NMAX], pAns;
int binarySearch(int left, int right, int target) {
while (left != right) {
int middle = (left + right) / 2;
if (vN[buffer[middle]] <= target) {
left = middle + 1;
} else {
right = middle;
}
}
return left;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &N);
for (int it = 0; it < N; ++it) {
scanf("%d", &vN[it]);
}
left = right = 0;
vN[N] = vN[0] + 1;
pos[N] = -1;
buffer[0] = N;
for (int it = 0; it < N; ++it) {
int position = binarySearch(left, right, vN[it]);
if (right == position && vN[buffer[position]] < vN[it]) {
buffer[++right] = it;
++position;
pos[it] = buffer[right - 1];
} else {
if (position != 0 && vN[buffer[position - 1]] == vN[it]) --position;
if (position != 0) {
pos[it] = buffer[position - 1];
} else {
pos[it] = -1;
}
buffer[position] = it;
}
if (max < position + 1) {
max = position + 1;
pMax = it;
}
}
printf("%d\n", max);
//for (int it = 0; it < N; ++it) printf("%d ", pos[it]);
//printf("\n");
pAns = max;
while(pMax != -1 && pAns) {
ans[--pAns] = vN[pMax];
pMax = pos[pMax];
}
for (int it = 0; it < max; ++it) {
printf("%d ", ans[it]);
}
fclose(stdin);
//fclose(stdout);
return 0;
}