Pagini recente » Cod sursa (job #2701558) | Cod sursa (job #2170627) | Cod sursa (job #777537) | Cod sursa (job #1274663) | Cod sursa (job #930579)
Cod sursa(job #930579)
#include<stdio.h>
inline int max(int a , int b)
{
if(a > b)
return a;
return b;
}
int v[100001] , a[100001] , best[100001] , sol[100001];
int n , poz , maxim;
int cb(int val)
{
int st=1 , dr=v[0] , med;
while(st < dr)
{
med=(st + dr) >> 1;
if(v[med] < val)
st=med + 1;
else
dr=med;
}
return st;
}
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]);
v[1]=a[1];
v[0]=1;
best[1]=1;
maxim=1;
if(v[1] < a[2])
{
v[++v[0]]=a[2];
best[2]=2;
maxim=2;
}
for (int i=2 ; i<=n ; ++i)
{
poz=cb(a[i]);
v[poz]=a[i];
best[i]=poz;
maxim=max(maxim , best[i]);
v[0]=max(v[0] , poz + 1);
//printf("%d " , best[i]);
}
printf("%d\n" , maxim);
for (int i=n ; i>=1 && maxim >= 0 ; --i)
if(best[i] == maxim)
{
sol[++sol[0]]=a[i];
--maxim;
}
for (int i=sol[0] ; i>=1 ; --i)
printf("%d " , sol[i]);
return 0;
}