Pagini recente » Cod sursa (job #985746) | Cod sursa (job #2121585) | Cod sursa (job #1747657) | Cod sursa (job #2328937) | Cod sursa (job #1607700)
#include <fstream>
#include <stack>
using namespace std;
int binarySearch(int left, int right, int N, int val, int a[], int tail[])
{
int middle;
while (right - left > 1)
{
middle = left + (right - left) / 2;
if (a[tail[middle]] >= val)
right = middle;
else
left = middle;
}
return right;
}
int main()
{
int N, i;
ifstream f("scmax.in");
f >> N;
int a[N];
for (i = 0; i < N; i++)
f >> a[i];
f.close();
int tail[N + 1], prev[N], pos;
int len = 1;
tail[1] = 0, prev[0] = -1;
for (i = 1; i < N; i++)
if (a[i] < a[tail[1]])
{
tail[1] = i;
prev[i] = -1;
}
else if (a[i] > a[tail[len]])
{
prev[i] = tail[len];
tail[++len] = i;
}
else
{
pos = binarySearch(0, len + 1, len + 1, a[i], a, tail);
prev[i] = tail[pos - 1];
tail[pos] = i;
}
stack<int> st;
i = tail[len];
while (i != -1)
{
st.push(a[i]);
i = prev[i];
}
ofstream g("scmax.out");
g << len << '\n';
while (!st.empty())
g << st.top() << ' ', st.pop();
g.close();
return 0;
}