Pagini recente » Cod sursa (job #366080) | Cod sursa (job #2434782) | Cod sursa (job #1320048) | Cod sursa (job #2906245) | Cod sursa (job #2737144)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 100000;
int N, v[1 + NMAX], dp[1 + NMAX];
int lis[1 + NMAX], sz;
int BinarySearch(int val) {
if (val > lis[sz]) {
lis[++sz] = val;
return sz;
}
int left = 1, right = sz, mid, pos;
while (left <= right) {
mid = (left + right) / 2;
if (lis[mid] >= val) {
right = mid - 1;
pos = mid;
}
else {
left = mid + 1;
}
}
lis[pos] = val;
return pos;
}
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin >> N;
for (int i = 1; i <= N; ++i)
fin >> v[i];
for (int i = 1; i <= N; ++i) {
dp[i] = BinarySearch(v[i]);
}
int last = 2e9 + 1;
vector <int> answer;
for (int i = N; i >= 1; --i) {
if (dp[i] == sz && v[i] < last) {
answer.push_back(v[i]);
--sz;
last = v[i];
}
}
reverse(answer.begin(), answer.end());
fout << answer.size() << "\n";
for (auto& i : answer) {
fout << i << " ";
}
fin.close();
fout.close();
return 0;
}