Pagini recente » Diferente pentru utilizator/rodik_rody intre reviziile 62 si 57 | Istoria paginii utilizator/sanke | Diferente pentru fmi-no-stress-9-warmup/solutii intre reviziile 26 si 20 | Istoria paginii utilizator/nanopico | Cod sursa (job #2990640)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> a(100005);
#define INF 2000000002
int n;
int main() {
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> a[i];
}
vector<int> dp(n+5,INF);
vector<int> par(n + 5,-1);
vector<int> ind(n + 5,-1);
dp[0] = -INF;
for (int i = 1; i <= n; i++) {
int pos = upper_bound(dp.begin() , dp.begin(), a[i]) - dp.begin();
if (dp[pos - 1] < a[i] && a[i] < dp[pos]) {
ind[pos] = i;
par[i] = ind[pos-1];
dp[pos] = a[i];
}
}
int nr = 0;
for (int i = 1; i <= n; i++) {
if (dp[i] != INF) {
nr = i;
}
}
fout << nr<<'\n';
vector<int> rasp;
int el_ultim = ind[nr];
while (el_ultim != -1) {
rasp.push_back(a[el_ultim]);
el_ultim = par[el_ultim];
}
reverse(rasp.begin(), rasp.end());
for (auto i : rasp) {
fout << i << ' ';
}
fout << '\n';
return 0;
}