Pagini recente » Cod sursa (job #1959693) | Cod sursa (job #910415) | Cod sursa (job #2224338) | Cod sursa (job #99284) | Cod sursa (job #2564559)
#include <fstream>
#include <iostream>
#include <stack>
using namespace std;
const int N = 100005;
int a[N], n, dp[N], k, pos[N];
void Read ()
{
ifstream fin ("scmax.in");
fin >> n;
for (int i = 1; i <= n; i++)
fin >> a[i];
fin.close();
}
int BinSearch (int x)
{
int left, right, mid, p;
left = 1;
right = k;
while (left <= right)
{
mid = (left + right) / 2;
if (dp[mid] >= x)
{
p = mid;
right = mid - 1;
}
else left = mid + 1;
}
return p;
}
void Solve ()
{
for (int i = 1; i <= n; i++)
if (a[i] > dp[k])
{
dp[++k] = a[i];
pos[i] = k;
}
else
{
int p = BinSearch(a[i]);
dp[p] = a[i];
pos[i] = p;
}
int p = 1;
for (int i = 2; i <= n; i++)
if (pos[i] > pos[p])
p = i;
ofstream fout ("scmax.out");
fout << k << "\n";
stack <int> st;
st.push(a[p]);
for (int i = p - 1; i >= 1; i--)
if (pos[i] == k - 1 && a[i] < a[p])
{
st.push(a[i]);
k--;
p = i;
}
while (!st.empty())
{
fout << st.top() << " ";
st.pop();
}
fout << "\n";
fout.close();
}
int main()
{
Read();
Solve();
return 0;
}