Pagini recente » Cod sursa (job #1536797) | Cod sursa (job #833231) | Cod sursa (job #2644359) | Cod sursa (job #1659790) | Cod sursa (job #1414375)
#include <stdio.h>
#include <algorithm>
#include <climits>
using namespace std;
int n,u,i,l[100001],p[100001],a[100001],x,t,sol[100001],j;
int cautare(int x,int y,int v)
{
if (x==y) return x;
else
{
int m=(x+y)>>1;
if (l[m]<v) return cautare(m+1,y,v);
else return cautare(x,m,v);
}
}
int main()
{
freopen ("scmax.in","r",stdin);
freopen ("scmax.out","w",stdout);
scanf("%i",&n);
for (i=1;i<=n;i++) scanf("%i",&a[i]);
l[++u]=a[1]; p[1]=1; l[2]=INT_MAX;
for (i=2;i<=n;i++)
{
j=cautare(1,u+1,a[i]);
if (j==u+1) l[++u+1]=INT_MAX;
l[j]=a[i];
p[i]=j;
}
printf("%i\n",u);
for (x=n,i=u;i>0;i--)
{
while (p[x]!=i) x--;
sol[++t]=a[x];
}
for (i=t;i>0;i--) printf("%i ",sol[i]);
fclose(stdin);
fclose(stdout);
return 0;
}