Pagini recente » Cod sursa (job #1709335) | Cod sursa (job #2542081) | Cod sursa (job #2331199) | Cod sursa (job #542075) | Cod sursa (job #1803704)
#include<cstdio>
#include<algorithm>
using namespace std;
int v[100006],lp[100004],aib[100006],v1[100001],v2[100001];
int n,i,j,m,maxim,poz,cate;
void update(int poz,int val)
{
while(poz<=n)
{
if(v[val]>v[aib[poz]])
aib[poz]=val;
poz+=(poz^(poz&poz-1));
}
}
int query(int poz)
{
int p1=0;
while(poz>=1)
{
if(v[aib[poz]]>v[p1])
p1=aib[poz];
poz-=(poz^(poz&poz-1));
}
return p1;
}
int main ()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&lp[i]);
v1[i]=lp[i];
}
sort(lp+1,lp+n+1);
for(i=1;i<=n;i++)
{
int l1,l2,mid,o=0;
l1=1;
l2=n;
while(l1<=l2)
{
mid=(l1+l2)/2;
if(lp[mid]==v1[i])
{
o=mid;
l2=mid-1;
}
else
if(lp[mid]>v1[i])
l2=mid-1;
else
l1=mid+1;
}
v2[i]=o;
}
for(i=1;i<=n;i++)
{
int val1=query(v2[i]-1);
v[i]=v[val1]+1;
update(v2[i],i);
}
for(i=1;i<=n;i++)
if(v[i]>maxim)
maxim=v[i];
printf("%d\n",maxim);
for(i=n;i>=1;i--)
if(v[i]==maxim)
{
v2[++cate]=i;
maxim--;
}
for(i=cate;i>=1;i--)
printf("%d ",v1[v2[i]]);
return 0;
}