Pagini recente » Rezultatele filtrării | Cod sursa (job #3161097) | Borderou de evaluare (job #2880277) | Cod sursa (job #1909247) | Cod sursa (job #2487420)
#define DM 100001
#define inf 0x3f3f3f3f
#include <climits>
#include <fstream>
#include <map>
#include <stack>
using namespace std;
ifstream fi ("scmax.in");
ofstream fo ("scmax.out");
int n, v[DM], p[DM], l[DM], idx[DM], lmax = 1, crt;
map <int, int> mp;
stack <int> s;
int cautbin(int x) {
int lo = 1, hi = lmax, mid;
while (lo < hi) {
mid = (lo + hi)/2;
if (v[idx[mid]] < x)
lo = mid + 1;
else
hi = mid;
}
return hi;
}
int main() {
fi >> n;
v[0] = INT_MAX;
for (int i = 1; i <= n; ++i) {
fi >> v[i];
crt = cautbin(v[i]);
if (crt == lmax)
++lmax;
idx[crt] = i;
mp[v[i]] = v[idx[crt-1]];
}
fo << lmax - 1 << '\n';
crt = v[idx[lmax-1]];
s.push(crt);
for (int i = lmax - 1; i > 1; --i) {
crt = mp[crt];
s.push(crt);
}
while (!s.empty()) {
fo << s.top() << ' ';
s.pop();
}
return 0;
}