Pagini recente » Cod sursa (job #1970655) | Cod sursa (job #3232737) | Cod sursa (job #950194) | Cod sursa (job #1926988) | Cod sursa (job #640986)
Cod sursa(job #640986)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN = 100010;
int a[MAXN], s[MAXN], parent[MAXN];
int bsearch(int left, int right, int x, int a[], int s[]) {
int pos = right, m;
while (left <= right) {
m = (left+right)/2;
if (a[s[m]] >= x) {
pos = m;
right = m-1;
} else {
left = m+1;
}
}
return pos;
}
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
f >> n;
for (int i = 1; i <= n; i++) {
f >> a[i];
}
int tail = 0;
s[0] = 0;
for (int i = 1; i <= n; i++) {
if (a[s[tail]] < a[i]) {
tail++;
s[tail] = i;
parent[i] = s[tail-1];
} else {
int pos = bsearch(1, tail, a[i], a, s);
s[pos] = i;
parent[i] = s[pos-1];
}
}
g << tail << '\n';
int element = s[tail];
vector <int> result;
while (element != 0) {
result.push_back(a[element]);
element = parent[element];
}
reverse(result.begin(), result.end());
for (int i = 0; i < result.size(); i++) {
g << result[i] << " ";
}
g << '\n';
return 0;
}