Pagini recente » Cod sursa (job #1761383) | Cod sursa (job #1923929) | Cod sursa (job #1271343) | Cod sursa (job #2952531) | Cod sursa (job #2080226)
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
int a[NMAX], l[NMAX], p[NMAX];
int n, length = 1;
char buffer[NMAX];
int pos = 0;
ifstream in("scmax.in");
void parseInt(int &a) {
while (!isdigit(buffer[pos]))
if (++pos == NMAX)
in.read(buffer, NMAX), pos = 0;
a = 0;
while (isdigit(buffer[pos])) {
a = a * 10 + (buffer[pos] - '0');
if (++pos == NMAX)
in.read(buffer, NMAX), pos = 0;
}
}
void read() {
parseInt(n);
for (int i = 1; i <= n; ++i)
parseInt(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
}
ofstream out("scmax.out");
void print(int n) {
if (n != 0) {
print(p[n]);
out << a[n] << " ";
}
}
int main()
{
read();
l[1] = 1;
p[1] = 0;
int len;
for (int i = 2; i <= n; i++) {
len = binary(1, length, a[i]);
p[i] = l[len];
if (l[len + 1] == 0 || a[l[len + 1]] > a[i])
l[len + 1] = i;
if (len + 1 > length)
length = len + 1;
}
out << length << "\n";
print(l[length]);
out.close();
return 0;
}