Pagini recente » Cod sursa (job #71545) | Cod sursa (job #2743774) | Cod sursa (job #2230540) | Cod sursa (job #1931591) | Cod sursa (job #2265854)
#include <cstdio>
#include <cstdlib>
#define FILE_IN "scmax.in"
#define FILE_OUT "scmax.out"
const int MAXN = 100000 + 16;
int N, K, V[MAXN], Best[MAXN], Aux[MAXN];
int BinOptim(int, int, int);
int main()
{
freopen(FILE_IN, "r", stdin);
freopen(FILE_OUT, "w", stdout);
int pos;
scanf("%i", &N);
for(int i = 1; i <= N; ++i)
{
scanf("%i", V + i);
if(V[i] > Aux[K])
{
Aux[++K] = V[i];
Best[i] = K;
pos = i;
}
else
{
if(V[i] < Aux[1])
{
Aux[1] = V[i];
Best[i] = 1;
}
else
Best[i] = BinOptim(2, K, V[i]);
}
}
printf("%i\n", K);
Aux[K] = V[pos];
for(int i = pos - 1, k = K - 1; i && k; --i)
if(Best[i] == k && V[i] < V[pos])
{
pos = i;
Aux[k--] = V[pos];
}
for(int i = 1; i <= K; ++i)
printf("%i ", Aux[i]);
return 0;
}
int BinOptim(int st, int dr, int x)
{
int sol = 1;
while(st < dr)
{
int m = dr - (dr - st) / 2;
sol = m;
if(x >= Aux[m])
{
st = m + 1;
}
else
dr = m - 1;
}
Aux[sol] = x;
return st;
}