Pagini recente » Cod sursa (job #2690069) | Cod sursa (job #1997239)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <array>
using namespace std;
/*void printVec(vector<int> vec, int len) {
for (auto it = vec.begin(); it != vec.begin() + len; ++it) {
cout << *it << " ";
}
cout << endl;
}*/
ifstream f("scmax.in");
ofstream g("scmax.out");
array<int, 100005> T;
vector<int> vec;
void printSol(int index) {
if (T[index] != -1) {
printSol(T[index]);
}
g << vec[index] << " ";
}
int main() {
ios::sync_with_stdio(false);
int n;
f >> n;
for (int i = 0; i < n; i++) {
int x;
f >> x;
vec.push_back(x);
}
vector<int> lis;
lis.push_back(0);
int maxLen = 1, len = 1, indexSol = 0, i = 1;
T.fill(-1);
for (auto val = vec.begin() + 1; val != vec.end(); ++val) {
auto pos = lower_bound(lis.begin(), lis.end(), *val,
[](const int &x, const int &y) {
return vec[x] < y;
});
if (pos == lis.end()) {
lis.push_back(i);
pos = lis.end() - 1;
}
else {
*pos = i;
}
int intPos = pos - lis.begin();
len = intPos + 1;
if (intPos >= 1) {
T[i] = lis[intPos - 1];
}
//printVec(lis, len);
if (len > maxLen) {
maxLen = len;
indexSol = i;
}
++i;
}
g << maxLen << "\n";
printSol(indexSol);
return 0;
}