Pagini recente » Monitorul de evaluare | Cod sursa (job #650043) | Cod sursa (job #673406) | Cod sursa (job #650039) | Cod sursa (job #3316153)
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int NMAX = 1e5;
int v[NMAX + 5], poz[NMAX + 5];
vector <int> rec, vf;
int scm[NMAX]; /// scm[i] = cea mai mica valoare cu care sa se termine sirul de lungime i
int main() {
ifstream cin("scmax.in");
ofstream cout("scmax.out");
ios::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
scm[1] = v[1];
for (int i = 2; i <= n; i++) {
int st = 1, dr = n, r = -1;
while (st <= dr) {
int mid = (st + dr) / 2;
if (v[i] > scm[mid] && scm[mid] != 0) {
r = mid;
st = mid + 1;
}
else dr = mid - 1;
}
if (r == -1) scm[1] = min(scm[1], v[i]);
else {
scm[r + 1] = v[i];
poz[r + 1] = i;
}
}
int ans = 0;
for (int i = 1; i <= n; i++)
if (scm[i] > 0)
ans = max(ans, i);
cout << ans << '\n';
for (int i = ans; i >= 2; i--) vf.pb(v[poz[i]]);
for (int i = poz[2]; i >= 1; i--) {
if (v[i] < v[poz[2]]) {
vf.pb(v[i]);
break;
}
}
reverse(vf.begin(), vf.end());
for (auto x: vf) cout << x << " ";
return 0;
}