Pagini recente » Cod sursa (job #871380) | Cod sursa (job #2636751) | Cod sursa (job #1149295) | Cod sursa (job #1737832) | Cod sursa (job #2949893)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5 + 7;
static int n;
static int a[nmax];
static int nrm[nmax];
static int aib[nmax];
static int val[nmax];
static int pt[nmax];
int find(int p) {
int r = aib[0];
for (; p; p -= p & -p) if (val[aib[p]] > val[r]) r = aib[p];
return r;
}
void add(int p, int v) {
for (; p <= n; p += p & -p) if (val[aib[p]] < val[v]) aib[p] = v;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i], nrm[i] = a[i];
int sz = 1;
sort(nrm + 1, nrm + n + 1);
for (int i = 2; i <= n; i++) if (nrm[sz] != nrm[i]) nrm[++sz] = nrm[i];
for (int i = 1; i <= n; i++) a[i] = lower_bound(nrm + 1, nrm + sz + 1, a[i]) - nrm;
for (int i = 1; i <= n; i++) {
int f = find(a[i] - 1);
pt[i] = f;
val[i] = val[f] + 1;
add(a[i], i);
}
int p = find(n);
vector<int> res(val[p]);
for (int i = val[p] - 1; i >= 0; i--) {
res[i] = p;
p = pt[p];
}
cout << 4 << '\n';
for (int r : res) cout << nrm[r] << ' ';
}
int main() {
#ifdef LOCAL
freopen("file.in", "r", stdin);
#else
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
#endif
ios_base::sync_with_stdio(false), cin.tie(NULL);
solve();
}