Pagini recente » Cod sursa (job #2152844) | Cod sursa (job #410874) | Cod sursa (job #3165864) | Cod sursa (job #2693409) | Cod sursa (job #3166945)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int DIM = 100010;
int n, k;
int v[DIM], dp[DIM], f[DIM];
int getPos(int num) {
int left = 1, right = k;
while (left <= right) {
int middle = (left + right) / 2;
if (v[dp[middle]] < num)
left = middle + 1;
else
right = middle - 1;
}
return left;
}
void getSol(int index) {
if (index > 0) {
getSol(f[index]);
fout << v[index] << ' ';
}
}
int main() {
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v[i];
for (int i = 1; i <= n; i++) {
if (v[i] > v[dp[k]]) {
dp[++k] = i;
f[i] = dp[k - 1];
} else {
int position = getPos(v[i]);
dp[position] = i;
f[i] = dp[position - 1];
}
}
fout << k << '\n';
getSol(dp[k]);
return 0;
}