Pagini recente » Cod sursa (job #2713906) | Cod sursa (job #768663) | oji-2017 | Cod sursa (job #752335) | Cod sursa (job #216714)
Cod sursa(job #216714)
#include <cstdio>
#include <algorithm>
using namespace std;
int v[100100], d[100100], p[100100], sol[100100];
int i, j, n, lg, poz;
int bsearch(int l, int r) {
int m = (l+r)/2;
if ( ( v[d[m-1]] < v[i] ) && ( v[d[m]] >= v[i] ) )
return m;
if (l>r)
return lg+1;
if ( v[i] > v[d[m]] )
return bsearch(m+1, r);
else
return bsearch(l, m-1);
}
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]);
d[1] = 1;
lg=1;
for (i=2; i<=n; i++) {
poz = bsearch(1, lg);
if (poz>lg)
lg++;
d[poz] = i;
p[i] = d[poz-1];
}
printf("%d\n", lg);
poz = d[lg];
while (poz) {
sol[0]++;
sol[sol[0]] = v[poz];
poz = p[poz];
}
for (i=sol[0]; i>=1; i--)
printf("%d ", sol[i]);
return 0;
}