Pagini recente » Cod sursa (job #1715722) | Cod sursa (job #1887378) | Cod sursa (job #2863173) | Cod sursa (job #216594) | Cod sursa (job #2608108)
#include <cstdio>
int n, v[100005], last[100005], pred[100005], sol[100005], l;
int find(int x)
{
int st,dr,med;
st=1;
dr=l;
while (st<=dr)
{
med=(st+dr)>>1;
if (v[last[med]]<x && v[last[med+1]] >= x)
return med;
if (v[last[med+1]]<x)
st=med+1;
else
dr=med-1;
}
return l;
}
int main() {
int i, pos, cnt = 0;
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]]) {
pred[i] = 0;
last[1] = i;
}
else if(v[i] > v[last[l]]) {
pred[i] = last[l];
last[++l] = i;
}
else {
pos = find(v[i]);
pred[i] = last[pos];
last[pos+1] = i;
}
printf("%d\n", l);
for(i = last[l]; i != 0; i = pred[i])
sol[++cnt] = v[i];
for(i = cnt; i >= 1; --i)
printf("%d ", sol[i]);
}