Pagini recente » Cod sursa (job #2253175) | Cod sursa (job #2791504) | Cod sursa (job #2170311) | Cod sursa (job #2410303) | Cod sursa (job #2795270)
#include <iostream>
#include <stack>
#include <algorithm>
#define NMAX 100005
using namespace std;
int n, pn = 1, a[NMAX], s[NMAX], sl, p[NMAX];
inline int cb(const int X) {
int i, l;
for(i = n, l = pn; l; l >>= 1)
if(i - l >= 1 && a[i - l] >= X) i -= l;
return i;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
while(pn < n) pn <<= 1;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if(s[sl] < a[i]) {
s[++sl] = a[i];
p[i] = sl;
} else {
p[i] = cb(a[i]);
s[p[i]] = a[i];
}
}
printf("%d\n", sl);
stack<int> ans;
for(int i = n; i; --i)
if(p[i] == sl)
ans.push(a[i]), --sl;
while(!ans.empty()) printf("%d ", ans.top()), ans.pop();
return 0;
}