Pagini recente » Cod sursa (job #2552959) | Cod sursa (job #2899813) | Cod sursa (job #2490100) | Cod sursa (job #2292650) | Cod sursa (job #1897441)
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NM = 100010;
const int inf = 0x3f3f3f3f;
int N, i;
int v[NM], best[NM], prev[NM];
int get_pos(int n) {
int res = 0;
int left = 1; int right = n;
while (left <= right) {
int mid = left + (right - left) / 2;
if (v[best[mid]] < v[n + 1])
res = mid, left = mid + 1;
else right = mid - 1;
}
return res;
}
void print_lis(int n) {
if (n == 0) return;
print_lis(prev[n]);
out << v[n] << ' ';
}
int main()
{
in >> N;
for (i = 1; i <= N; ++i) {
in >> v[i];
}
v[0] = inf;
for (i = 1; i <= N; ++i) {
int current = get_pos(i - 1);
//if (current == 0) continue;
prev[i] = best[current];
best[current + 1] = i;
}
int ans;
for (ans = 1; best[ans+1]; ++ans);
out << ans << '\n';
print_lis(best[ans]);
return 0;
}