Pagini recente » Cod sursa (job #2196049) | Cod sursa (job #2123325) | Cod sursa (job #1380188) | Cod sursa (job #1853458) | Cod sursa (job #2274164)
#include <fstream>
#include <stack>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int dim = 100002;
int a[dim], dp[dim], P[dim], n, k;
stack <int> st;
int CautBin (int x)
{
int st, dr, mij, p;
if (dp[1] >= x)
return 1;
if (dp[k] == x)
return k;
st = 1;
dr = k;
p = 1;
while (st <= dr)
{
mij = (st + dr) / 2;
if (dp[mij] >= x)
{
p = mij;
dr = mij - 1;
}
else st = mij + 1;
}
return p;
}
int main()
{
int i, p;
fin >> n;
for (i = 1; i <= n; i++)
fin >> a[i];
dp[1] = a[1];
k = 1;
P[1] = 1;
for (i = 2; i <= n; i++)
{
if (a[i] > dp[k])
{
dp[++k] = a[i];
P[i] = k;
}
else
{
p = CautBin (a[i]);
dp[p] = a[i];
P[i] = p;
}
}
fout << k << "\n";
p = 1;
for (i = 2; i <= n; i++)
if (P[i] > P[p])
p = i;
st.push(a[p]);
for (i = p - 1; i >= 1; i--)
{
if (P[i] == k - 1 && a[i] < a[p])
{
st.push(a[i]);
k--;
p = i;
}
}
while (!st.empty())
{
fout << st.top() << " ";
st.pop();
}
return 0;
}