Pagini recente » Cod sursa (job #3252270) | Cod sursa (job #3124661) | Cod sursa (job #1498130) | Cod sursa (job #336861) | Cod sursa (job #1257343)
#include <fstream>
void alg(int data[], int best[], int pred[], int ret[], int n, int &len)
{
int offset = 1;
best[0] = -1;
for (int i = 0; i < n; i++)
{
int l = 1, r = offset;
while (l < r)
{
int m = l + (r - l) / 2;
if (data[best[m]] < data[i])
l = m + 1;
else
r = m;
}
pred[i] = best[l - 1];
best[l] = i;
offset = std::max(offset, l + 1);
}
len = offset - 1;
int i;
for (i = len - 1, offset = best[offset - 1]; i >= 0; i--, offset = pred[offset])
ret[i] = data[offset];
}
int main()
{
std::ifstream in("scmax.in");
std::ofstream out("scmax.out");
int data[100000], n, offset = 0, best[100001], pred[100000], ret[100000], len;
in >> n;
for (int i = 0; i < n; i++)
in >> data[i];
alg(data, best, pred, ret, n, len);
out << len << '\n';
for (int i = 0; i < len; i++)
out << ret[i] << ' ';
out << '\n';
in.close(), out.close();
}