Pagini recente » Cod sursa (job #257329) | Cod sursa (job #2735928) | Cod sursa (job #2137724) | Cod sursa (job #351180) | Cod sursa (job #2916652)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int i,j,n,m,L,st,dr,mid,aux,k;
int v[100005],D[100005],t[100005],x[100005];
int main()
{
cin>>n;
for(i=1;i<=n;++i)
cin>>v[i];
/// sursa complexitate nlog(n)
/// La un pas i avem L = lungimea maxima a unui subsir crescator cu elemente de pe pozitii <=i
/// la pas i tinem un vector D cu L elemente (indici din v) in care
/// v[D[j]] = val minima dintre pozitiile 1 si i in care se termina un subsir crescator de lungime j
for(i=1;i<=n;++i)
{
if(v[i]>v[D[L]])
D[++L]=i,t[D[L]]=D[L-1];
else
{
st=1;
dr=L;
while(st<=dr)
{
mid=(st+dr)/2;
if(v[i]>v[D[mid]])
st=mid+1;
else
dr=mid-1;
}
D[dr+1]=i;
t[D[dr+1]]=D[dr];
}
}
cout<<L<<"\n";
aux=D[L];
while(aux)
x[++k]=aux,aux=t[aux];
for(i=k;i>=1;--i)
cout<<v[x[i]]<<' ';
return 0;
}