Pagini recente » Cod sursa (job #925364) | Cod sursa (job #652252) | Cod sursa (job #1056325) | Cod sursa (job #1141697) | Cod sursa (job #2607650)
#include <cstdio>
int n, v[100005], last[100005] {}, pred[100005] {}, i, l, pos;
int ceil(int x) {
int st = 1, dr = n, m;
while(st <= dr) {
m = (st + dr) / 2;
if(v[m] <= x)
st = m + 1;
else
dr = m - 1;
}
return dr;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(i = 1; i <= n; ++i)
scanf("%d", &v[i]);
for(i = 1; i <= n; ++i)
if(v[i] < v[last[1]])
last[1] = i;
else if(v[i] > v[last[l]]) {
pred[i] = last[l];
last[++l] = i;
}
else {
pos = ceil(v[i]);
last[pos] = i;
pred[i] = last[pos-1];
}
printf("%d\n", l);
for(i = last[l], l = 0; i > 0; i = pred[i])
last[++l] = v[i];
for(i = l; i >= 1; --i)
printf("%d ", last[i]);
}