Pagini recente » Cod sursa (job #958868) | Cod sursa (job #2055655) | Cod sursa (job #1954885) | Cod sursa (job #56665) | Cod sursa (job #1521468)
#include <cstdio>
#include <cstring>
#include <stack>
#include <algorithm>
using namespace std;
const int maxN = 1e5;
int N, v[maxN + 1], p[maxN + 1], q[maxN + 1];
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &N);
for(register int i = 1; i <= N; ++ i)
scanf("%d", &v[i]);
q[1] = v[1]; p[1] = 1;
int sq = 1;
for(register int i = 1; i <= N; ++ i) {
int *ptr = lower_bound(q + 1, q + sq + 1, v[i]);
if(ptr == q + sq + 1)
q[++ sq] = v[i], p[i] = sq;
else
q[ptr - q] = v[i], p[i] = ptr - q;
}
printf("%d\n", sq);
int target = sq;
stack<int> sol;
for(register int i = N; i > 0; -- i) {
if(p[i] == target) {
sol.push(v[i]);
-- target;
}
}
while(!sol.empty())
printf("%d ", sol.top()), sol.pop();
return 0;
}