Pagini recente » Cod sursa (job #3205736) | Cod sursa (job #2690064) | Cod sursa (job #2328) | Cod sursa (job #1186467) | Cod sursa (job #1870503)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 1e5 + 5;
const int INF = 0;
int n, maxim = 1;
int dp[N_MAX], v[N_MAX], sol[N_MAX];
void read() {
ifstream fin("scmax.in");
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
}
fin.close();
}
void solve() {
int index;
dp[1] = v[1];
sol[1] = 1;
for (int i = 2; i <= n; ++i) {
int *posv = upper_bound(dp + 1, dp + maxim + 1, v[i]);
index = posv - dp;
if (v[i] == dp[index - 1]) {
--index;
}
if (index > maxim) {
maxim = index;
}
sol[i] = index;
dp[index] = v[i];
}
int x = maxim;
for (int i = n; i >=1; --i) {
if (sol[i] == x) {
dp[x] = v[i];
--x;
}
}
}
void write() {
ofstream fout("scmax.out");
fout << maxim << "\n";
for (int i = 1; i <= maxim; ++i) {
fout << dp[i] << " ";
}
fout.close();
}
int main() {
read();
solve();
write();
return 0;
}