Pagini recente » Cod sursa (job #3166005) | Cod sursa (job #2088786) | Cod sursa (job #574280) | Cod sursa (job #1610684) | Cod sursa (job #3174445)
#include <fstream>
//#include <climits>
#include <iostream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n,v[100005];
int l[100005],poz[100005];
int cb(int x,int st,int dr)///cel mai mic nr mai mare decat x
{
int rez=1;
while(st<=dr)
{
int mij=(st+dr)/2;
if(l[mij]>=x)
dr=mij-1,rez=mij;
else if(l[mij]<x)
st=mij+1;
}
return rez;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)cin>>v[i];
l[1]=v[1];
int li=1;
poz[1]=1;
for(int i=2; i<=n; i++)
{
if(v[i]>l[li])///continua subsirul
{
l[++li]=v[i];
poz[i]=li;
}
else if(v[i]<l[li])
{
int poz1=cb(v[i],1,li);///
l[poz1]=v[i];
poz[i]=poz1;
}
}
cout<<li<<'\n';
int sol[100005],k=0;
int aux=INT_MAX;
int pozmax=li;
for(int i=n; i>=1; i--)
{
if(poz[i]==pozmax)
{
while(aux<v[i])
i--;
if(poz[i]==pozmax)
{
pozmax--;
//cout<<v[i]<<" ";
sol[k++]=v[i];
aux=v[i];
}
}
}
for(int i=k-1; i>=0; i--)
cout<<sol[i]<<" ";
return 0;
}