Pagini recente » Rating Bostan Alexandru Ionut (ooflul) | Cod sursa (job #3247148) | Cod sursa (job #276718) | Cod sursa (job #253196) | Cod sursa (job #1157528)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
class Scmax {
public:
Scmax(vector<int> in) : A(in), best(in.size()), P(in.size()) {}
pair< int, vector<int> > solve() {
int longest = 0;
int longestIndex = 0;
best[0] = 0;
P[0] = 0;
for (size_t i=1; i<A.size(); ++i) {
P[i] = i;
int l, h;
for (l=0, h=longest; l<=h; ) {
int m = (l+h) >> 1;
if (A[best[m]] == A[i]) { l = m; break; }
if (A[best[m]] < A[i]) l = m + 1;
else h = m - 1;
}
if (l > longest) {
longest ++;
longestIndex = i;
best[longest] = i;
P[i] = best[longest-1];
continue;
}
if (A[i] < A[best[l]]) {
best[l] = i;
if (l > 0) P[i] = best[l-1];
}
}
vector<int> result;
for (int i=longestIndex; P[i] != i; i = P[i]) result.push_back(A[i]);
reverse(result.begin(), result.end());
return make_pair(longest, result);
}
private:
vector<int> A;
vector<int> best, P;
};
int main() {
ifstream in("scmax.in");
ofstream out("scmax.out");
int N;
in >> N;
vector<int> A(N);
while (N--) { int x; in >> x; A.push_back(x); };
Scmax sc(A);
pair<int, vector<int> > result = sc.solve();
out << result.first << "\n";
ostream_iterator<int> oi(out, " ");
copy(result.second.begin(), result.second.end(), oi);
return 0;
}