Pagini recente » Cod sursa (job #3256825) | Cod sursa (job #2870367) | Cod sursa (job #2060362) | Cod sursa (job #1927071) | Cod sursa (job #3178603)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int N;
vector<int> a;
vector<int> p;
vector<int> dp;
int binarySearch(int x, int n, vector<int> &a) {
int l, r, m, p;
l = 1;
r = n;
while (l <= r) {
m = (l + r) / 2;
if (a[m] >= x) {
p = m;
r = m - 1;
} else {
l = m + 1;
}
}
return p;
}
void citire() {
fin >> N;
a.resize(N + 1);
p.resize(N + 1);
dp.resize(N + 1);
for (int i = 1; i <= N; i++)
fin >> a[i];
}
void solve() {
int lg;
dp[1] = a[1];
p[1] = 1;
lg = 1;
for (int i = 2; i <= N; i++) {
if (dp[lg] < a[i]) {
dp[++lg] = a[i];
p[i] = lg;
} else {
int poz = binarySearch(a[i], lg, dp);
dp[poz] = a[i];
p[i] = poz;
}
}
fout << lg << '\n';
vector<int> ans;
for (int j = N, i = lg; j >= 1; j--)
if (p[j] == i) {
ans.push_back(a[j]);
i--;
}
reverse(ans.begin(), ans.end());
for (auto it : ans)
fout << it << ' ';
fout << '\n';
}
int main() {
citire();
solve();
fin.close();
fout.close();
return 0;
}