Pagini recente » Cod sursa (job #2982738) | Cod sursa (job #2052020) | Cod sursa (job #3004469) | Cod sursa (job #112525) | Cod sursa (job #1877341)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100010
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
int v[NMAX], best[NMAX], l[NMAX], p[NMAX], n, nr;
int caut(int x)
{
int ls = 0, ld = nr, m = (ls + ld) / 2;
while (ls <= ld)
{
if (v[l[m]] < x && v[l[m + 1]] >= x) return m;
else if (v[l[m + 1]] < x)
{
ls = m + 1;
m = (ls + ld) / 2;
}
else
{
ld = m - 1;
m = (ls + ld) / 2;
}
}
return nr;
}
void Write(int x)
{
if (p[x] > 0) Write(p[x]);
g<<v[x]<<' ';
}
int main()
{
nr = 1;
f>>n;
for (int i = 1; i <= n; i++)
f>>v[i];
l[1] = best[1] = 1;
l[0] = 0;
for (int i = 2; i <= n; i++)
{
int poz = caut(v[i]);
p[i] = l[poz];
best[i] = poz + 1;
l[poz + 1] = i;
if (poz + 1 > nr) nr = poz + 1;
}
int maxim = 0, poz = 0;
for (int i = 1; i <= n; i++)
if (maxim < best[i])
{
maxim = best[i]; poz = i;
}
g<<maxim<<'\n';
Write(poz);
return 0;
}