Pagini recente » Cod sursa (job #615465) | Cod sursa (job #867625) | Cod sursa (job #160420) | Cod sursa (job #2224053) | Cod sursa (job #218982)
Cod sursa(job #218982)
#include<cstdio>
int n, lc, v[100000], prev[100000], c[100000];
int bsearch(int x)
{
int l = 0, r = lc - 1, m;
while(l <= r)
{
m = l + (r - l)/2;
if(v[c[m]] == v[x])
return m;
if(v[x] < v[c[m]])
r = m - 1;
else
l = m + 1;
// else
}
return m;
}
void print(int x)
{
if(x < 0)
return;
print(prev[x]);
printf("%d ", v[x]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
int i, cur;
for(i = 0; i < n; ++i)
{
scanf("%d", &v[i]);
prev[i] = -1;
}
lc = 1; c[0] = 0;
for(i = 1; i < n; ++i)
{
cur = bsearch(i);
if(v[i] <= v[c[cur]] )
{
c[cur] = i;
prev[i] = (cur == 0 ? -1 : c[cur-1]);
}
else
{
c[cur+1] = i;
prev[i] = c[cur];
if(cur == lc - 1)
++lc;
}
}
printf("%d\n", lc);
print(c[lc-1]);
return 0;
}