Pagini recente » Cod sursa (job #560021) | Cod sursa (job #3196035) | Cod sursa (job #1208395) | Cod sursa (job #140623) | Cod sursa (job #2105268)
#include <iostream>
#include <fstream>
#define NMAX 100001
using namespace std;
int a[NMAX], n;
int pred[NMAX];
int l[NMAX];
void read() {
ifstream in("scmax.in");
in >> n;
for (int i = 1; i <= n; i++)
in >> a[i];
in.close();
}
int binary(int left, int right, int value) {
int mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (a[l[mid]] < value && (a[l[mid + 1]] >= value || mid == right))
return l[mid];
if (a[l[mid]] >= value)
right = mid - 1;
else
left = mid + 1;
}
return 0;
}
ofstream out("scmax.out");
void print(int i) {
if (i != 0) {
print(pred[i]);
out << a[i] << " ";
}
}
int main() {
read();
int maxL = 0, len;
for (int i = 1; i <= n; i++) {
len = binary(1, maxL, a[i]);
pred[i] = l[len];
if (l[len + 1] == 0 || a[l[len + 1]] > a[i])
l[len + 1] = i;
if (len + 1 > maxL)
maxL = len + 1;
}
out << maxL << "\n";
print(l[maxL]);
out.close();
return 0;
}