Pagini recente » Cod sursa (job #653886) | Cod sursa (job #609979) | Cod sursa (job #2051768) | Cod sursa (job #1553849) | Cod sursa (job #1235844)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAXN = 100005;
int N, A[MAXN], L[MAXN], P[MAXN], Best[MAXN], nr, maxim;
int Caut(int x)
{
int l, r, m;
l = 0; r = nr;
while (l <= r)
{
m = (l + r) / 2;
if (A [L[m] ] < x && A[ L[m + 1] ] >= x) return m;
else if (A[ L[m + 1]] < x) l = m + 1;
else r = m - 1;
}
return nr;
}
void Print(int i)
{
if (P[i] > 0) Print(P[i]);
fout << A[i] << " ";
}
int main()
{
int poz;
nr = 1;
fin >> N;
for (int i = 1; i <= N; ++i) fin >> A[i];
Best[1] = L[1] = 1; L[0] = 0;
for (int i = 2; i <= N; ++i)
{
poz = Caut(A[i]);
P[i] = L[poz];
Best[i] = poz + 1;
L[poz + 1] = i;
if (nr < poz + 1) nr = poz + 1;
}
poz = 0;
for (int i = 1; i <= N; ++i)
{
if (maxim < Best[i])
{
maxim = Best[i];
poz = i;
}
}
fout << maxim << '\n';
Print(poz);
fin.close();
fout.close();
return 0;
}