Pagini recente » Cod sursa (job #2160673) | Cod sursa (job #1057900) | Cod sursa (job #2904506) | Cod sursa (job #3039737) | Cod sursa (job #1640003)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int v[100010],norm[100010],d[100010],tata[100010],aib[100010],sol[100010],n;
int poz_norm(int x)
{
return lower_bound(norm+1,norm+1+n,x)-norm;
}
void aib_update(int i,int a)
{
for(;i<=n;i+=i&(-i))
if(d[a]>d[aib[i]]) aib[i]=a;
}
int aib_query(int i)
{
int a=0;
for(;i>0;i-=i&(-i))
if(d[aib[i]]>d[a]) a=aib[i];
return a;
}
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]);
norm[i]=v[i];
}
sort(norm+1,norm+1+n);
for(int i=1;i<=n;i++)
{
int poz=poz_norm(v[i]);
int a=aib_query(poz-1);
d[i]=d[a]+1;
tata[i]=a;
aib_update(poz,i);
}
int poz=0,nr=0;
for(int i=1;i<=n;i++)
if(d[i]>d[poz]) poz=i;
for(;poz;poz=tata[poz]) sol[++nr]=v[poz];
printf("%d\n",nr);
for(int i=nr;i;i--) printf("%d ",sol[i]);
return 0;
}