Pagini recente » Cod sursa (job #1205445) | Cod sursa (job #1239524) | Cod sursa (job #187323) | Cod sursa (job #2637387) | Cod sursa (job #1947430)
#include <stdio.h>
#define NMAX 100010
int N, vN[NMAX], length[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;
pos[it] = buffer[right - 1];
length[it] = right - left + 1;
} else {
pos[it] = pos[buffer[position]];
buffer[position] = it;
length[it] = position - left + 1;
}
if (max < length[it]) {
max = length[it];
pMax = it;
}
}
printf("%d\n", max);
pAns = max;
while(pMax != -1) {
ans[--pAns] = vN[pMax];
pMax = pos[pMax];
}
for (int it = 0; it < max; ++it) {
printf("%d ", ans[it]);
}
fclose(stdin);
//fclose(stdout);
return 0;
}