Pagini recente » Cod sursa (job #1504778) | Cod sursa (job #1748904) | Cod sursa (job #2637316) | Cod sursa (job #2874588) | Cod sursa (job #2607937)
#include <cstdio>
int n, v[100005], last[100005], pred[100005], sol[100005];
void print(int i)
{
if(pred[i]>0)
print(pred[i]);
printf("%d ",v[i]);
}
int find(int x) {
int st = 1, dr = n, m;
while(st <= dr) {
m = (st + dr) >> 1;
if(v[last[m]] >= x)
dr = m-1;
else
st = m+1;
}
return dr;
}
int main() {
int i, l , pos, maxx=0;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(i = 1; i <= n; ++i)
scanf("%d", &v[i]);
sol[1]=last[1]=l=1;
for(i = 1; i <= n; ++i)
{
pos = find(v[i]);
pred[i]=last[pos];
sol[i]=pos+1;
last[pos+1]=i;
if(l<pos+1)
l=pos+1;
}
maxx=pos=0;
for(i=1;i<=n;++i)
if(maxx<sol[i])
{
maxx=sol[i];
pos=i;
}
printf("%d\n",maxx);
print(pos);
return 0;
}