Pagini recente » Cod sursa (job #2014156) | Cod sursa (job #590949) | Cod sursa (job #2436745) | Cod sursa (job #2467664) | Cod sursa (job #1380144)
#include <fstream>
#include <vector>
#include <algorithm>
const int MAX_N(100001);
int n;
int v [MAX_N], pred [MAX_N];
std::vector<int> s, result;
inline void Read (void)
{
std::ifstream input("scmax.in");
input >> n;
for (int i(1) ; i <= n ; ++i)
input >> v[i];
input.close();
}
inline void Print (void)
{
for (int i(s.back()) ; i ; i = pred[i])
result.push_back(v[i]);
std::reverse(result.begin(),result.end());
std::ofstream output("scmax.out");
output << result.size() << '\n';
for (unsigned int i(0) ; i < result.size() ; ++i)
output << result[i] << ' ';
output << '\n';
output.close();
}
inline void Compute (void)
{
s.push_back(1);
for (int i(2) ; i <= n ; ++i)
if (v[i] > v[s.back()])
{
pred[i] = s.back();
s.push_back(i);
}
else
{
int l(0), r(s.size() - 1), m((l + r) / 2);
while (l < r)
{
if (v[s[m]] < v[i])
l = m + 1;
else
r = m;
m = (l + r) / 2;
}
if (v[s[m]] > v[i])
{
if (m > 0)
pred[i] = s[m - 1];
s[m] = i;
}
}
}
int main (void)
{
Read();
Compute();
Print();
return 0;
}