Pagini recente » Cod sursa (job #337483) | Cod sursa (job #793359) | Cod sursa (job #1989899) | Cod sursa (job #116719) | Cod sursa (job #2980261)
/// [A][M][C][B][N] ///
#include <bits/stdc++.h>
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const char sp = ' ', nl = '\n';
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int nmax = 1e5;
int v[nmax + 1]{0}, n;
int t[nmax + 1]{0};
int dp[nmax + 1]{0};
map<int, int> m;
void update(int i, int x) {
for (; i <= nmax; i += i & (-i)) {
t[i] = max(t[i], x);
}
}
int get(int i) {
int s = 0;
for (; i > 0; i -= i & (-i)) {
s = max(s, t[i]);
}
return s;
}
void read() {
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
m[v[i]] = 0;
}
int cnt = 0;
for (auto it = m.begin(); it != m.end(); ++it) {
it->second = ++cnt;
}
for (int i = 1; i <= n; ++i) {
v[i] = m[v[i]];
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
read();
int ans = 1;
for (int i = 1; i <= n; ++i) {
dp[i] = get(v[i] - 1) + 1;
update(v[i], dp[i]);
if (dp[ans] < dp[i]) {
ans = i;
}
}
fout << dp[ans] << nl;
int cnt = dp[ans];
stack<int> st;
while (cnt) {
if (dp[ans] == cnt) {
st.push(v[ans]);
cnt--;
}
ans--;
}
for (auto it = m.begin(); it != m.end() && st.size(); ++it) {
if (st.top() == ++cnt) {
fout << it->first << sp;
st.pop();
}
}
}