Pagini recente » Cod sursa (job #1005374) | Cod sursa (job #2177375) | Cod sursa (job #87446) | Cod sursa (job #42293) | Cod sursa (job #1653803)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
vector <int> ans;
int n, v[100005], previous[100005], pos[100005], pos_size = 1;
inline int bin_search(int l, int r, int val) {
int med, ans = 0;
while(l <= r) {
med = (l + r) / 2;
if(v[pos[med]] < val) {
l = med + 1;
ans = med;
}
else {
r = med - 1;
}
}
return ans;
}
int main() {
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> v[i];
}
pos[1] = 1;
for(int i = 2; i <= n; ++i) {
if(v[i] > v[pos[pos_size]]) {
++pos_size;
pos[pos_size] = i;
previous[i] = pos[pos_size - 1];
}
else {
int new_pos = bin_search(0, pos_size, v[i]);
pos[new_pos + 1] = i;
previous[i] = pos[new_pos];
}
}
cout << pos_size << '\n';
for(int i = pos[pos_size]; i >= 1; i = previous[i]) {
ans.push_back(v[i]);
}
for(int i = ans.size() - 1; i >= 0; --i) {
cout << ans[i] << ' ';
}
cout << '\n';
return 0;
}