Pagini recente » Cod sursa (job #3179115) | Cod sursa (job #3162244) | Cod sursa (job #3230303) | Cod sursa (job #2504303) | Cod sursa (job #2250578)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int last[100001];
int v[100001];
vector <int> dp;
vector <int> answer;
int main()
{
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
int n;
dp.push_back(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
for (int i = 1; i <= n; ++i) {
if (v[i] > v[dp.back()]) {
last[i] = dp.back();
dp.push_back(i);
continue;
}
int currentPosition = -1;
for (int power = 20; power >= 0; --power) {
if (currentPosition + (1 << power) < dp.size() and v[i] > v[dp[currentPosition + (1 << power)]]) {
currentPosition += (1 << power);
}
}
currentPosition += 1;
last[i] = dp[currentPosition - 1];
dp[currentPosition] = i;
}
int current = dp.back();
while (current) {
answer.push_back(v[current]);
current = last[current];
}
reverse(answer.begin(), answer.end());
cout << answer.size() << '\n';
for (auto x : answer) {
cout << x << ' ';
}
return 0;
}