Pagini recente » Cod sursa (job #1120356) | Cod sursa (job #2648347) | Cod sursa (job #2684007) | Cod sursa (job #942698) | Cod sursa (job #1101036)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAXN = 100005;
int best[MAXN], lung[MAXN];
int v[MAXN], N, sol;
void Read() {
fin >> N;
for (int i = 1; i <= N; ++i)
fin >> v[i];
}
int BinSearch(int nr) {
int Left = 1; int Right = sol; int Middle;
while (Right - Left > 1) {
Middle = (Right - Left) / 2 + Left;
if (best[Middle] > nr)
Left = Middle;
else
Right = Middle;
}
if (best[Right] > nr) {
if (best[Right + 1] < nr) {
best[Right + 1] = nr;
++sol;
return sol;
}
}else if (best[Left] > nr) {
if (best[Right] < nr) {
best[Right] = nr;
return Left;
}
}
if (best[1] < nr)
best[1] = nr;
return 1;
}
void Solve() {
best[1] = v[N];
lung[N] = 1;
sol = 1;
for (int i = N - 1; i; --i)
lung[i] = BinSearch(v[i]);
}
void Write() {
fout << sol << '\n';
for (int i = 1; i <= N; ++i)
if (lung[i] == sol) {
--sol;
fout << v[i] << ' ';
}
}
int main() {
Read();
Solve();
Write();
fin.close();
fout.close();
return 0;
}