Pagini recente » Cod sursa (job #1911753) | Cod sursa (job #2772846) | Cod sursa (job #2694377) | Cod sursa (job #2694371) | Cod sursa (job #1933250)
#include <cstdio>
#include <cstring>
#define NMAX 100003
using namespace std;
int v[NMAX],L[NMAX],R[NMAX],nr;
void afis(int pos)
{
if(R[pos]!=-1)
afis(R[pos]);
printf("%d ",v[pos]);
}
int bs(int l,int r,int x)
{
int m = (l+r)/2;
while(l<r)
{
if(x >= v[L[m]])
{
l = m + 1;
}
else
{
r = m;
}
m = (l+r)/2;
}
return l;
}
int main()
{
int n,i,pos;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&v[i]);
memset(R,-1,sizeof(R));
L[nr] = 0;
for(i=1;i<n;i++)
{
if(v[i]>v[L[nr]])
{
L[++nr] = i;
R[i] = L[nr-1];
}
else if(v[i]<v[L[0]])
{
L[0] = i;
}
else
{
pos = bs(0,nr,v[i]);
L[pos] = i;
if(pos>0)R[i] = L[pos - 1];
}
}
printf("%d\n",nr+1);
afis(L[nr]);
}