Pagini recente » Cod sursa (job #1292038) | Cod sursa (job #284417) | Cod sursa (job #858981) | Borderou de evaluare (job #2008889) | Cod sursa (job #2860468)
#include <fstream>
#define N (int)1e5+5
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int n, a[N], l[N], best[N], t[N], nr;
///best[i] - cea mai mare pozitie pe care o poate ocupa i intr-un subsir sc
/// t[i] - nodul aflat inaintea lui i in subsir
void citire()
{
fin>>n;
for (int i=1; i<=n; ++i) fin>>a[i];
fin.close();
}
int caut(int x)
{
int st=0, dr=nr;
while (st<=dr)
{
int m=(st+dr)/2;
if (a[l[m]]<x && x<=a[l[m+1]]) return m;
else if (a[l[m+1]]<x) st=m+1;
else dr=m-1;
}
return nr;
}
void precalculare()
{
nr=1;
best[1]=1; l[1]=1; l[0]=0;
for (int i=2; i<=n; ++i)
{
int poz=caut(a[i]);
t[i]=l[poz];
best[i]=poz+1;
l[poz+1]=i;
if (nr<poz+1) nr=poz+1;
}
}
void drum(int x)
{
if (t[x]!=0) drum(t[x]);
fout<<a[x]<<' ';
}
void afisare()
{
int lgmax=-1;
int x;
for (int i=1; i<=n; ++i)
if (lgmax<best[i])
{
lgmax=best[i]; x=i;
}
fout<<lgmax<<'\n';
drum(x);
}
int main()
{
citire();
precalculare();
afisare();
return 0;
}