Pagini recente » Cod sursa (job #1057661) | Cod sursa (job #1369812) | Cod sursa (job #817832) | Cod sursa (job #3255278) | Cod sursa (job #2856415)
#include <iostream>
using namespace std;
const int NMAX = 1e5;
int n, a[NMAX + 1], dp[NMAX + 1], dpl, t[NMAX + 1];
inline int cb(const int Q) {
int st = 1, dr = dpl, mij, ans;
while(st <= dr) {
mij = (st + dr) / 2;
if(a[dp[mij]] >= a[Q]) dr = mij - 1, ans = mij;
else st = mij + 1;
}
return ans;
}
void printSol(const int X) {
if(t[X]) printSol(t[X]);
printf("%d ", a[X]);
}
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[dp[dpl]] < a[i]) {
dp[++dpl] = i;
t[i] = dp[dpl - 1];
} else {
const int crt = cb(i);
dp[crt] = i;
t[i] = dp[crt - 1];
}
printf("%d\n", dpl);
printSol(dp[dpl]);
return 0;
}