Pagini recente » Cod sursa (job #1296636) | Cod sursa (job #2533430) | Borderou de evaluare (job #2051214) | Cod sursa (job #1382151) | Cod sursa (job #2080217)
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
int a[NMAX], l[NMAX];
int n, length = 1;
void read() {
ifstream in("scmax.in");
in >> n;
for (int i = 1; i <= n; ++i)
in >> a[i];
in.close();
}
int binary(int first, int last, int value) {
int mid, n = last;
while (first <= last) {
mid = first + (last - first) / 2;
if ((a[l[mid]] < value) && (a[l[mid + 1]] >= value || mid == n))
return mid;
else {
if (a[l[mid]] >= value)
last = mid - 1;
else
first = mid + 1;
}
}
return 0; /// return the length
}
int main()
{
read();
l[1] = 1;
int len;
for (int i = 2; i <= n; i++) {
len = binary(1, length, a[i]);
if (l[len + 1] == 0 || a[l[len + 1]] > a[i])
l[len + 1] = i;
if (len + 1 > length)
length = len + 1;
}
ofstream out("scmax.out");
out << length << "\n";
for (int i = 1; i <= length; i++)
out << a[l[i]] << " ";
out.close();
return 0;
}