Pagini recente » Cod sursa (job #3167662) | Cod sursa (job #3185682) | Cod sursa (job #3206188) | Cod sursa (job #3272367) | Cod sursa (job #3164236)
#include <iostream>
#include <fstream>
#include <limits>
using namespace std;
int binsearch(int arr[], int L, int R, int x){
int l = L, h = R;
while (l != h){
int m = (l + h) / 2;
if (x <= arr[m]){
h = m;
}
else {
l = m + 1;
}
}
return l;
}
int main(){
ifstream cin ("scmax.in");
ofstream cout("scmax.out");
int N;
cin >> N;
int A[N + 1];
for(int i = 0; i < N; i++){
cin >> A[i];
}
const int inf = std::numeric_limits<int>::max();
int n, m, l;
int M[N + 10];
int L[N + 10];
int K[N + 10];
int B[N + 10];
A[N] = inf;
n = m = l = 0;
M[0] = A[0];
for (int i = 1; i < N; i++)
M[i] = inf;
for (int i = 0; i <= N; i++)
B[i] = inf;
for (int i = 0; i <= N; i++)
L[i] = 0;
K[0] = 1;
while (n != N){
m = max(m, L[n] + 1);
L[n + 1] = binsearch(M, 0, m + 1, A[n + 1]);
M[L[n + 1]] = min(M[L[n + 1]], A[n + 1]);
K[n + 1] = L[n + 1] + 1;
n = n + 1;
}
l = m;
n = N - 1;
while (l != 0){
if (K[n] == l && A[n] < B[l]){
B[l - 1] = A[n];
l = l - 1;
n = n - 1;
} else {
n = n - 1;
}
}
for (int i = 0; i < m; i++)
cout << B[i] << '\n';
return 0;
}