Pagini recente » Cod sursa (job #414953) | Cod sursa (job #1136293) | Cod sursa (job #610382) | Cod sursa (job #3126081) | Cod sursa (job #2539105)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
const int N=100001;
int best[N],prec[N],ind[N],nr;
long long v[N];
int bs (long long x)
{
int st=0,dr=nr,m=(st+dr)/2;
while (st<=dr)
{
if (v[ind[m]]<x && v[ind[m+1]]>=x) return m;
else if (x>v[ind[m+1]])
{
st=m+1;
m=(st+dr)/2;
}
else
{
dr=m-1;
m=(st+dr)/2;
}
}
return nr;
}
void afis (int i)
{
if (prec[i]) afis(prec[i]);
out<<v[i]<<' ';
}
int main()
{
int n,poz,maxx=0;
in>>n;
for (int i=1;i<=n;i++)
in>>v[i];
best[1]=1;
ind[1]=ind[0]=0;
for (int i=2;i<=n;i++)
{
poz=bs(v[i]);
best[i]=poz+1; //in cel mai bun caz sta pe pozitia poz+1 in cmlsc
prec[i]=ind[poz]; //indicele elementului dinainte de v[i]
ind[poz+1]=i; //indicele elementului de pe pozitia poz+1
if (nr<poz+1) nr=poz+1;
}
//int ret;
for (int i=1;i<=n;i++)
if (best[i]>maxx)
{
maxx=best[i];
poz=i;
}
out<<maxx<<'\n';
afis (poz);
return 0;
}