Pagini recente » gabe | Cod sursa (job #1277883) | Rating Ionel Herescu (zetta) | Cod sursa (job #1738759) | Cod sursa (job #2035940)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
#define MAX 100000
int v[MAX + 1], S[MAX + 1], pr[MAX + 1];
int N;
int BinarySearch(int low, int high, int x)
{
while (low + 1 < high)
{
int mid = (low + high) / 2;
if (x <= v[S[mid]])
{
high = mid - 1;
}
else
{
low = mid;
}
}
return (v[S[high]] < x) ? high : low;
}
int main()
{
in >> N;
for (int i = 1; i <= N; i++)
{
in >> v[i];
}
int len = 0;
for (int i = 1; i <= N; i++)
{
if (len == 0)
{
pr[i] = -1;
S[++len] = i;
}
else if (v[i] > v[S[len]])
{
pr[i] = S[len];
S[++len] = i;
}
else
{
int poz = BinarySearch(0, len, v[i]);
pr[i] = S[poz];
S[poz + 1] = i;
}
}
out << len << '\n';
int i = S[len];
len = 0;
for (; i > 0; i = pr[i])
{
S[len++] = v[i];
}
for (i = len - 1; i >= 0; i--)
{
out << S[i] << ' ';
}
}