Pagini recente » Borderou de evaluare (job #495201) | Borderou de evaluare (job #739897) | Borderou de evaluare (job #483498) | Borderou de evaluare (job #1641328) | Cod sursa (job #2412051)
#include<bits/stdc++.h>
using namespace std;
const int maxN=(1e5)+5;
int n,pre[maxN],m[maxN],dm;
int v[maxN];
vector<int> sub;
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]);
pre[1]=0;
dm=1;
m[dm]=1;
for(int i=2;i<=n;i++)
{
int st=1;
int dr=dm;
int sol=0;
while(st<=dr)
{
int mid=(st+dr)>>1;
if(v[m[mid]]<v[i])
{
sol=mid;
st=mid+1;
}
else dr=mid-1;
}
if(sol==dm)
{
pre[i]=m[dm];
m[++dm]=i;
}
else
if(v[m[sol+1]]>v[i])
{
pre[i]=m[sol];
m[sol+1]=i;
}
}
printf("%d\n",dm);
int x=m[dm];
while(x)
{
sub.push_back(v[x]);
x=pre[x];
}
reverse(sub.begin(),sub.end());
for(auto it:sub)
printf("%d ",it);
printf("\n");
return 0;
}