Pagini recente » Cod sursa (job #286723) | Cod sursa (job #1327356) | Cod sursa (job #2329152) | Cod sursa (job #2906364) | Cod sursa (job #2531711)
#include <fstream>
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
const int N=100001;
int v[N],best[N],p[N],ind[N],nr;
int cauta (int x)
{
int p=0,u=nr,m=(p+u)/2;
while (p<=u)
{
if (v[ind[m]]<x && x<=v[ind[m+1]]) return m;
else if (v[ind[m+1]]<x) {p=m+1;m=(p+u)/2;}
else {u=m-1;m=(p+u)/2;}
}
return nr;
}
void afis (int x)
{
if (p[x]!=0) afis (p[x]);
out<<v[x]<<' ';
}
int main()
{
int n,maxx=0,poz;
in>>n;
for (int i=1;i<=n;i++)
in>>v[i];
best[1]=1;
ind[1]=0;
ind[0]=0;
for (int i=2;i<=n;i++)
{
poz=cauta(v[i]);
best[i]=poz+1;
p[i]=ind[poz];
ind[poz+1]=i;
if (nr<poz+1) nr=poz+1;
}
for (int i=1;i<=n;i++)
if (best[i]>maxx)
{
maxx=best[i];
poz=i;
}
out<<maxx<<'\n';
afis (poz);
return 0;
}