Pagini recente » Cod sursa (job #3132068) | Cod sursa (job #2169592)
#include <bits/stdc++.h>
const int NMAX = 100005;
using namespace std;
int n, a[NMAX];
vector<int> s1;
stack<int> s2;
void read()
{
scanf("%d ", &n);
for (int i = 1; i <= n; i++)
scanf("%d ", &a[i]);
}
int lg;
void solve()
{
for (int i = 1; i <= n; i++)
{
auto it = upper_bound(s1.begin(), s1.end(), a[i], [](const int &x, const int &y) { return x <= y; });
if (it == s1.end())
{
s1.push_back(a[i]);
lg = s1.size();
s2.push(s1.size());
continue;
}
int pos = it - s1.begin();
lg = max(lg, pos);
s1[pos] = a[i];
s2.push(pos + 1);
}
while(!s2.empty() && s2.top() != lg)
s2.pop();
vector<int> result;
for (int i = n; !s2.empty(); i--, s2.pop())
{
int x = s2.top();
if (x == lg) {
result.push_back(i);
lg--;
}
}
printf("%d\n", result.size());
reverse(result.begin(), result.end());
for (int i : result)
printf("%d ", a[i]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
read();
solve();
return 0;
}