Pagini recente » Istoria paginii monthly-2014/runda-4/clasament | Cod sursa (job #2907566) | Cod sursa (job #2536856) | Cod sursa (job #760529) | Cod sursa (job #3253313)
#include <bits/stdc++.h>
using namespace std;
int v[100001], k=1, dp[100001],last[100001];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
freopen("scmax.in", "r",stdin);
freopen("scmax.out", "w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
dp[1]=1;
for(int i=2;i<=n;i++)
{
if(v[i]>v[dp[k]])
{
last[i]=dp[k];
k++;
dp[k]=i;
}
else
{
int st=1, dr=k;
while(st<=dr)
{
int mij=(st+dr)/2;
if(v[dp[mij]]>v[i])
{
dr=mij-1;
}
else st=mij+1;
}
last[i]=last[dp[st]];
dp[st]=i;
}
}
cout<<k<<'\n';
vector<int> ans;
int x=dp[k];
ans.push_back(v[x]);
while(last[x])
{
x=last[x];
ans.push_back(v[x]);
}
sort(ans.begin(),ans.end());
for(auto e:ans)
cout<<e<<" ";
return 0;
}