Pagini recente » Cod sursa (job #1270998) | Cod sursa (job #2584508) | Cod sursa (job #2568437) | Cod sursa (job #1368136) | Cod sursa (job #3259904)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int pos[100001];
int a[100001];
int minNrPos[100001];
set<int> maxLen;
void output(int currentPos) {
if (pos[currentPos] == 0) {
fout << a[currentPos] << ' ';
return;
}
output(pos[currentPos]);
fout << a[currentPos] << ' ';
}
int main() {
int n;
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
int ansLen = 1, lastPos = 1;
for (int i = 1; i <= n; ++i) {
bool found = 0;
for (set<int>::reverse_iterator it = maxLen.rbegin(); it != maxLen.rend(); ++it) {
// cout << *it << ' ' << minNrPos[*it] << '\n';
if (a[i] > a[minNrPos[*it]]) {
found = 1;
pos[i] = minNrPos[*it];
if (minNrPos[*it + 1] == 0 || a[i] < a[minNrPos[*it + 1]]) {
minNrPos[*it + 1] = i;
}
if (*it + 1 > ansLen) {
ansLen = *it + 1;
lastPos = i;
}
maxLen.insert(*it + 1);
break;
}
}
if (found == 0) {
maxLen.insert(1);
if (minNrPos[1] == 0 || a[i] < a[minNrPos[1]]) {
minNrPos[1] = i;
}
}
}
// cout << maxLen.size() << ' ';
fout << ansLen << '\n';
output(lastPos);
return 0;
}