Pagini recente » Cod sursa (job #1519878) | Cod sursa (job #1510857) | Cod sursa (job #1510891) | Monitorul de evaluare | Cod sursa (job #1527577)
#include <cstdio>
#define DIM 100010
using namespace std;
int K, N;
int V[DIM], T[DIM], W[DIM], D[DIM];
void DFS (int pos)
{
if (T[pos] != 0)
DFS (T[pos]);
printf ("%d ", V[pos]);
return;
}
int main ()
{
freopen ("scmax.in" ,"r", stdin );
freopen ("scmax.out","w", stdout);
scanf ("%d", &N);
for (int i = 1; i <= N; i ++)
scanf ("%d", &V[i]);
W[++K] = 1; D[1] = 1;
for (int i = 2; i <= N; i ++)
{
if (V[i] > V[W[K]])
{
W[++K] = i;
T[i] = W[K-1];
D[i] = 1 + D[W[K-1]];
} else {
int st = 1, dr = K;
while (st <= dr)
{
int mid = st + (dr - st) / 2;
if (V[i] > V[W[mid]])
st = mid + 1;
else
dr = mid - 1;
}
if (V[W[dr]] < V[i])
{
W[st] = i;
T[i] = W[dr];
D[i] = 1 + D[W[dr]];
}
}
}
int maxim = 0, pos;
for (int i = 1; i <= N; i ++)
{
if (maxim < D[i])
{
maxim = D[i];
pos = i;
}
}
printf ("%d\n", maxim);
DFS (pos);
fclose (stdin );
fclose (stdout);
return 0;
}