Pagini recente » Cod sursa (job #1267321) | Cod sursa (job #715097) | Cod sursa (job #1979472) | Cod sursa (job #572259) | Cod sursa (job #1925228)
#include <fstream>
#include <vector>
using namespace std;
struct ans {
vector<int> seq;
int len;
};
int ceil_binary_search(vector<int> &v, int l, int r, int key) {
while(r - l > 1) {
int m = l + (r - l) / 2;
if(v[m] >= key) {
r = m;
} else {
l = m;
}
}
return r;
}
ans longest_increasing_seq(vector<int> &v) {
vector<int> tail(v.size(), 0);
int length = 1;
tail[0] = v[0];
for(int i = 1; i < v.size(); i++) {
if(v[i] < tail[0]) {
tail[0] = v[i];
} else if(v[i] > tail[length - 1]) {
tail[length++] = v[i];
} else {
tail[ceil_binary_search(tail, -1, length - 1, v[i])] = v[i];
}
}
ans answer;
answer.seq = tail;
answer.len = length;
return answer;
}
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
vector<int> v;
int n, x;
f >> n;
for(int i = 0; i < n; i++) {
f >> x;
v.push_back(x);
}
ans answer = longest_increasing_seq(v);
g << answer.len << endl;
for(int i = 0; i < answer.len; i++) {
g << answer.seq[i] << " ";
}
return 0;
}