Pagini recente » Cod sursa (job #2924212) | Cod sursa (job #499662) | Cod sursa (job #752916) | Cod sursa (job #566822) | Cod sursa (job #2727663)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int n, a[NMAX + 1], dp[NMAX + 1], t[NMAX + 1], dpl;
inline int cb(const int QUERY) {
int ST = 1, DR = dpl, MIJ, ANS = DR + 1;
while(ST <= DR) {
MIJ = (ST + DR) / 2;
if(a[dp[MIJ]] >= a[QUERY]) DR = MIJ - 1, ANS = MIJ;
else ST = MIJ + 1;
}
return ANS;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
dp[dpl = 1] = 1;
for(int i = 2; i <= n; ++i) {
if(a[i] > a[dp[dpl]]) t[i] = dp[dpl], dp[++dpl] = i;
else {
const int poz = cb(i);
t[i] = dp[poz - 1], dp[poz] = i;
}
}
printf("%d\n", dpl);
stack<int> st;
for(int i = dp[dpl]; i; i = t[i]) st.push(i);
while(!st.empty()) printf("%d ", a[st.top()]), st.pop();
return 0;
}