Pagini recente » Cod sursa (job #751451) | Arhiva de probleme | Cod sursa (job #2617112) | Cod sursa (job #2617255) | Cod sursa (job #1072053)
#include<algorithm>
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int bsearch(const vector<int>& a, const vector<int>& m,
int left, int right, int x) {
int result = -1;
while (left <= right) {
int mid = (left+right)/2;
if (a[m[mid]] < x) {
result = mid;
left = mid+1;
} else {
right = mid-1;
}
}
return result;
}
vector<int> longestIncrSubseq(const vector<int>& a) {
vector<int> result;
vector<int> m(a.size()), p(a.size());
m[0] = 0;
p[0] = -1;
int maxlen = 0;
for (int i = 1; i < a.size(); i++) {
int pos = bsearch(a, m, 0, maxlen, a[i]);
if (pos == -1) {
p[i] = -1;
} else {
p[i] = m[pos];
}
m[pos+1] = i;
maxlen = max(maxlen, pos+1);
}
int current = m[maxlen];
while (current != -1) {
result.push_back(a[current]);
current = p[current];
}
reverse(result.begin(), result.end());
return result;
}
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
f >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
f >> a[i];
}
vector<int> result = longestIncrSubseq(a);
g << result.size() << endl;
for (int x : result) {
g << x << " ";
}
g << endl;
return 0;
}