Pagini recente » Cod sursa (job #2112358) | Cod sursa (job #2913408) | Cod sursa (job #370860) | Cod sursa (job #1953488) | Cod sursa (job #2367280)
#include <fstream>
#include <iostream>
#include <stack>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int N = 1e5 + 1;
int a[N], dp[N], n, P[N], k;
stack <int> st;
int BinSearch (int x)
{
if (x > dp[k])
return k + 1;
if (x <= dp[1])
return 1;
int left, right, mid, pos;
left = 1;
right = k;
pos = -1;
while (left <= right)
{
mid = (left + right) / 2;
if (dp[mid] >= x)
{
pos = mid;
right = mid - 1;
}
else left = mid + 1;
}
return pos;
}
int main()
{
int i, p;
fin >> n;
for (i = 1; i <= n; i++)
fin >> a[i];
dp[++k] = a[1];
P[1] = 1;
for (i = 2; i <= n; i++)
{
p = BinSearch(a[i]);
if (p == k + 1)
{
k++;
dp[k] = a[i];
}
dp[p] = a[i];
P[i] = p;
}
fout << k << "\n";
for (i = n; i >= 1; i--)
if (P[i] == k)
{
st.push(i);
k--;
}
while (!st.empty())
{
fout << a[st.top()] << " ";
st.pop();
}
return 0;
}