Pagini recente » Cod sursa (job #2397125) | Cod sursa (job #9961) | Cod sursa (job #2780389) | Cod sursa (job #3147817) | Cod sursa (job #2416522)
#include <fstream>
#include <iostream>
#define maxi 100005
using namespace std;
ifstream f ("scmax.in");
ofstream g("scmax.out");
int n,v[maxi];
int prv[maxi];
int minim[maxi];/// minim[i] cel mai mic element care sfarseste un subsir cresc de lungime i
int k;
void afis(int i) // lucrez cu indicii
{
if (prv[i]==0)
{
g<<v[i]<<" ";
return;
}
afis (prv[i]);
g<<v[i]<<" ";
}
int bs(int x)
{
int i=1,j=k;
while (i<=j)
{
int m=(i+j)/2;
if (v[minim[m]]<x)
{
i=m+1;
}
else if (v[minim[m]]==x)
return m;
else {
j=m-1;
}
}
return i;
}
int main()
{
f>>n;
for (int i=1;i<=n;i++)
f>>v[i];
minim[1]=1;
k=1;
for (int i=2;i<=n;i++)
{
if (v[i]>v[minim[k]])
{
prv[i]=minim[k];
minim[++k]=i;
}
else
{ int o=bs(v[i]);
minim[o]=i;
prv[i]=minim[o-1];
}
}
g<<k<<'\n';
afis(minim[k]);
}