Pagini recente » Cod sursa (job #138912) | Cod sursa (job #619029) | Cod sursa (job #2681611) | Cod sursa (job #545247) | Cod sursa (job #1163274)
#include <fstream>
#include <vector>
#include <cstdio>
#include <iostream>
using namespace std;
const int MAX = 100050;
int N;
int A[MAX], prev[MAX];
vector<int> V;
int getPosition(int X) {
int poz, N = V.size(), step;
for(step = 1; step <= N; step <<= 1);
for(poz = -1; step; step >>= 1) {
if(poz + step >= N) continue;
if(V[poz + step] < X)
poz += step;
}
return poz;
}
void OpenFiles() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
}
void CloseFiles() {
fclose(stdin);
fclose(stdout);
}
void Afisare(int ind, int poz) {
if(!poz || !ind) return;
for(; ind && A[ind] != poz; ind--);
Afisare(ind - 1, prev[ind]);
cout << A[ind] << " ";
}
int main() {
OpenFiles();
cin >> N;
for(int i = 1, poz; i <= N; i++) {
cin >> A[i];
poz = getPosition(A[i]);
if(poz != -1)
prev[i] = V[poz];
if(++poz == V.size())
V.push_back(A[i]);
else
V[poz] = min(V[poz], A[i]);
}
cout << V.size() << "\n";
Afisare(N, V.back());
CloseFiles();
}