Pagini recente » Cod sursa (job #2646848) | Cod sursa (job #2875131) | Cod sursa (job #2914530) | Cod sursa (job #2785389) | Cod sursa (job #3208025)
#include <bits/stdc++.h>
void read_input(int &n, std::vector<int> &vec)
{
std::ifstream fin("scmax.in");
fin >> n;
vec.resize(n);
for (int i = 0; i < n; ++i)
fin >> vec[i];
fin.close();
}
void print_output(int len, int index, std::vector<int> &p, std::vector<int> &v)
{
std::ofstream fout("scmax.out");
std::stack<int> st;
fout << len << '\n';
while (p[index] != -1) {
st.push(v[index]);
index = p[index];
}
fout << v[index] << ' ';
while (!st.empty()) {
fout << st.top() << ' ';
st.pop();
}
fout << '\n';
fout.close();
}
int bsearch_ls(std::vector<int> &ls, std::vector<int> &v, int x)
{
int l, r, m;
l = 0;
r = ls.size() - 1;
m = (l + r) / 2;
while (l < r) {
if (x < v[ls[m]])
r = m;
else if (x > v[ls[m]])
l = m + 1;
else
return m;
m = (l + r) / 2;
}
return m;
}
int main()
{
int n;
int ls_index = 0;
std::vector<int> v;
std::vector<int> p;
std::vector<int> ls;
read_input(n, v);
p.resize(n, -1);
ls.push_back(0);
for (int i = 1; i < n; ++i) {
if (v[i] > v[ls.back()]) {
p[i] = ls.back();
ls.push_back(i);
} else {
ls_index = bsearch_ls(ls, v, v[i]);
ls[ls_index] = i;
if (ls_index > 0)
p[i] = ls[ls_index - 1];
}
}
print_output(ls.size(), ls.back(), p, v);
return 0;
}