Pagini recente » Cod sursa (job #1452868) | Cod sursa (job #1787074) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1357515)
#include<stdio.h>
int v[100010];
int l[100010];
int b[100010];
int r[100010];
int n, pos, lim;
void search(int &val)
{
int start = 0, stop = lim;
pos = (start + stop) / 2;
while(start < stop) {
if(v[l[pos]] < val && val <= v[l[pos + 1]]) return;
else if(v[l[pos + 1]] < val) start = pos + 1;
else stop = pos;
pos = (start + stop) / 2;
}
pos = lim;
}
void print(int i)
{
if(r[i] == 0) return;
print(r[i]);
printf("%d ", v[r[i]]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(int i = 1 ; i <= n ; ++i) {
scanf("%d", &v[i]);
}
lim = b[1] = l[1] = 1;
for(int i = 2 ; i <= n ; ++i) {
search(v[i]);
r[i] = l[pos];
++pos;
l[pos] = i;
b[i] = pos;
lim = lim < pos ? pos : lim;
}
int max = 0;
for(int i = 1 ; i <= n ; ++i) {
if(max < b[i]) {
max = b[i];
pos = i;
}
}
printf("%d\n", max);
print(pos);
return 0;
}