Pagini recente » Borderou de evaluare (job #347799) | Borderou de evaluare (job #720805) | Borderou de evaluare (job #1474474) | Borderou de evaluare (job #1255596) | Cod sursa (job #2164215)
#include <cstdio>
using namespace std;
int n, a[100001], l[100001], poz[100001], m, Max, p, u, k;
int main ()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for (int i=1; i<=n; i++) scanf("%d", &a[i]);
a[0]=2000000000;
for (int i=n; i>0; i--){
poz[i]=0;
p=1;
u=Max;
while (p<=u){
m=(p+u)/2;
if (a[i]<a[l[m]]) p=m+1;
else u=m-1;
}
if (p>Max){
Max=p;
poz[i]=l[p-1];
l[p]=i;
}
else{
poz[i]=l[p-1];
if (a[l[p]]<a[i]) l[p]=i;
}
}
printf("%d\n", Max);
for (int i=l[Max]; i>0; i=poz[i])
printf("%d ", a[i]);
}