Pagini recente » Cod sursa (job #2867712) | Cod sursa (job #406654) | Cod sursa (job #661392) | Cod sursa (job #491038) | Cod sursa (job #1748137)
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
deque<int> q;
int v[maxN],m[maxN],pre[maxN],n,dm,ls,ld,sol,mid;
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
// m[0]=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
}
m[1]=1;
dm=1;
for(int i=2;i<=n;i++)
{
ls=1;
ld=dm;
sol=0;
while (ls<=ld)
{
mid=(ls+ld)>>1;
if (v[m[mid]]<v[i])
{
sol=mid;
ls=mid+1;
}
else ld=mid-1;
}
if (!sol)
{
if (v[i]<v[m[1]])
{
m[1]=i;
pre[i]=0;
}
}
else
if (sol==dm)
{
dm++;
m[dm]=i;
// pre[dm]=m[dm-1];
pre[i]=m[dm-1];
}
else
if (v[i]<v[m[sol+1]])
{
m[sol+1]=i;
//pre[sol+1]=m[sol];
pre[i]=m[sol];
}
}
printf("%d\n",dm);
int ind=m[dm];
int j=v[ind];
while (j>0)
{
q.push_back(j);
ind=pre[ind];
j=v[ind];
}
while (!q.empty())
{
printf("%d ",q.back());
q.pop_back();
}
printf("\n");
return 0;
}