Pagini recente » Cod sursa (job #1723350) | Cod sursa (job #1644409) | Cod sursa (job #885086) | Cod sursa (job #2452297) | Cod sursa (job #2685175)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, a[100001], dp[100001], v[100001], p[100001], index;
int main() {
ios::sync_with_stdio(false);
in.tie(NULL), out.tie(NULL);
in >> n;
for (int i = 1; i <= n; i++) in >> a[i];
dp[++index] = a[1];
p[1] = 1;
for (int i = 2; i <= n; i++) {
if (a[i] > dp[index]) {
dp[++index] = a[i];
p[i] = index;
}
else {
int left = 1, right = index, poz = index + 1;
while (left <= right) {
int mid = (right + left) / 2;
if (dp[mid] >= a[i]) {
poz = mid;
right = mid - 1;
}
else left = mid + 1;
}
dp[poz] = a[i];
p[i] = poz;
}
}
out << index << '\n';
int j = n;
for (int i = index; i >= 1; i--) {
while (p[j] != i) j--;
v[i] = a[j];
}
for (int i = 1; i <= index; i++) out << v[i] << ' ';
}