Pagini recente » Cod sursa (job #426733) | Cod sursa (job #1561475) | Cod sursa (job #1639277) | Cod sursa (job #2887923) | Cod sursa (job #2886776)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const string filename = "scmax";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
const int maxN = 100005, inf = 2e9 + 5;
int n, v[maxN], dp[maxN], s[maxN], ans, last;
vector <int> sir;
int cautbin(int x)
{
int aux = 0;
for(int i = (1 << 19); i; i >>= 1)
if(aux + i <= n && s[aux + i] < x)
aux += i;
return aux;
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
{
fin >> v[i];
s[i] = inf;
}
for(int i = 1; i <= n; i++)
{
int poz = cautbin(v[i]) + 1;
dp[i] = poz;
s[poz] = min(s[poz], v[i]);
if(dp[i] > ans)
{
ans = dp[i];
last = i;
}
}
fout << ans << '\n';
sir.push_back(last), ans--;
for(int i = last; i >= 1; i--)
{
if(dp[i] == ans && v[i] < v[last])
{
sir.push_back(i);
ans--;
last = i;
}
}
reverse(sir.begin(), sir.end());
for(int x : sir)
fout << v[x] << ' ';
return 0;
}