Pagini recente » Istoria paginii runda/ffcxzczxczx | Cod sursa (job #2476914) | Cod sursa (job #272042) | Cod sursa (job #1889045) | Cod sursa (job #2709853)
#include <iostream>
#include <fstream>
#include <vector>
const int NMAX = 1e5;
int a[1 + NMAX];
int dp[1 + NMAX];
int dpIdx[1 + NMAX];
int prev[1 + NMAX];
std::vector<int> sol;
int bs(int value, int limit) {
int left = 1, right = limit, ans = 0;
while (left <= right) {
int mid = (left + right) >> 1;
if (dp[mid] < value) {
left = mid + 1;
ans = mid;
} else
right = mid - 1;
}
return ans;
}
int main() {
std::ifstream in("scmax.in");
std::ofstream out("scmax.out");
int n, lengthMax = 0;
in >> n;
for (int i = 1; i <= n; ++i)
in >> a[i];
for (int i = 1; i <= n; ++i) {
int pos = bs(a[i], lengthMax);
dp[pos + 1] = a[i];
dpIdx[pos + 1] = i;
prev[i] = dpIdx[pos];
lengthMax = std::max(lengthMax, pos + 1);
}
out << lengthMax << '\n';
int current = dpIdx[lengthMax];
while (current != 0) {
sol.emplace_back(current);
current = prev[current];
}
for (int i = (int)sol.size() - 1; i >= 0; --i)
out << a[sol[i]] << ' ';
out << '\n';
return 0;
}