Pagini recente » Cod sursa (job #3364235) | Monitorul de evaluare | Cod sursa (job #3363735) | Cod sursa (job #3363803) | Cod sursa (job #3364156)
#include <algorithm>
// #include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int& x : a)
cin >> x;
vector<int> tail; // valorile folosite pentru căutare binară
vector<int> last; // indicii corespunzători din a
vector<int> parent(n, -1); // legăturile pentru reconstrucție
for (int i = 0; i < n; ++i) {
// Prima poziție cu valoare >= a[i]
int p = lower_bound(tail.begin(), tail.end(), a[i])
- tail.begin();
// Predecesorul lui a[i] aparține subșirului de lungime p
if (p > 0)
parent[i] = last[p - 1];
if (p == tail.size()) {
tail.push_back(a[i]);
last.push_back(i);
} else {
tail[p] = a[i];
last[p] = i;
}
}
cout << tail.size() << '\n';
// Reconstruim subșirul pornind de la ultimul element
vector<int> lis;
if (!last.empty()) {
int index = last.back();
while (index != -1) {
lis.push_back(a[index]);
index = parent[index];
}
reverse(lis.begin(), lis.end());
}
for (int x : lis)
cout << x << ' ';
cout << '\n';
return 0;
}