Pagini recente » Cod sursa (job #405442) | Cod sursa (job #1802468) | Cod sursa (job #2665829) | Cod sursa (job #2659542) | Cod sursa (job #2280870)
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
typedef long long T;
const int NMAX = 100005;
const long long VALMAX = 2000003;
int N;
vector<T> arr(NMAX);
vector<T> tail(NMAX, 0);
vector<T> pre(NMAX, -1);
stack<T> st;
int ceilIndex(const vector<T> &tail, const vector<T> &arr, int l, int r, T val) {
while (l + 1 < r) {
int m = l + (r - l) / 2;
if (arr[tail[m]] <= val) {
l = m;
} else {
r = m;
}
}
return r;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &N);
for (int i = 0; i < N; ++i) {
scanf("%lld", &arr[i]);
tail[i] = 0;
}
int L = 0;
int p = 0;
for (int i = 0; i < N; ++i) {
if (arr[i] < arr[tail[0]]) {
tail[0] = i;
} else if (arr[i] > arr[tail[L]]) {
pre[i] = tail[L];
tail[++L] = i;
p = i;
} else {
int pos = ceilIndex(tail, arr, -1, L, arr[i]);
pre[i] = tail[pos - 1];
tail[pos] = i;
}
}
printf("%d\n",L+1);
while (p != -1) {
st.push(arr[p]);
p = pre[p];
}
while (!st.empty()) {
T elm = st.top();
st.pop();
printf("%lld ", elm);
}
return 0;
}