Pagini recente » Cod sursa (job #652849) | Cod sursa (job #2935569) | Cod sursa (job #280042) | Cod sursa (job #797957) | Cod sursa (job #183057)
Cod sursa(job #183057)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define FIN "scmax.in"
#define FOUT "scmax.out"
#define MAX_N 100005
int V[MAX_N];
int B[MAX_N];
int p[MAX_N];
int k, nr, N;
int L[MAX_N];
int BEST;
int i, j, pz;
int search(int x)
{
int li = 0, lf = nr, m;
while (li <= lf)
{
m = (li + lf) >> 1;
if (V[ L[m] ] < x && V[ L[m + 1] ] >= x) return m;
if (V[ L[m + 1] ] < x) li = m + 1;
else lf = m - 1;
}
return nr;
}
inline void print (int c)
{
if (p[c]) print(p[c]);
printf("%d ",V[c]);
}
void solve ()
{
int i;
B[1] = L[1] = 1;
for (i = 2; i <= N; i++)
{
pz = search(V[i]), p[i] = L[pz];
B[i] = pz + 1, L[pz + 1] = i;
if (nr < pz + 1) nr = pz + 1;
}
for (i = 1; i <= N; i++) if (BEST < B[i]) BEST = B[i], pz = i;
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &N);
for (i = 1; i <= N; i++) scanf("%d", V + i);
solve ();
printf("%d\n", BEST), print(pz);
return 0;
}