Pagini recente » Cod sursa (job #2102716) | Cod sursa (job #1314895) | Cod sursa (job #2794881) | Cod sursa (job #500945) | Cod sursa (job #3157630)
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long ll;
vector<ll>scmax(vector<ll>&a)
{
vector<ll> scm,bck(a.size());
scm.push_back(0);
bck[0]=0;
ll i,st,dr,mid,rez;
for(i=1;i<a.size();i++)
{
//cerr<<i<<endl;
if(a[i]>a[scm.back()]){bck[i]=scm.size();scm.emplace_back(i);continue;}
if(a[i]<=a[scm.front()]){bck[i]=0;scm[0]=i;continue;}
st=0,dr=scm.size()-1;
while(true)
{
//cerr<<st<<' '<<dr<<endl;
if(st==dr){if(a[scm[st]]<a[i])rez=st;break;}
mid=(st+dr)/2;
if(a[scm[mid]]<a[i])rez=mid,st=mid+1;
else dr=mid;
}
bck[i]=rez+1;
scm[rez+1]=i;
}
vector<ll> rezultat(scm.size());
dr=scm.size()-1;
for(i=a.size()-1;i>=0;i--)
{
if(bck[i]==dr)rezultat[dr]=i,dr--;;
}
return rezultat;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
ll n,i,j;
cin>>n;
vector<ll> v(n);
for(i=0;i<n;i++)cin>>v[i];
vector<ll> rez=scmax(v);
cout<<rez.size()<<'\n';
for(i=0;i<rez.size();i++)cout<<v[rez[i]]<<' ';
return 0;
}