Pagini recente » Cod sursa (job #324413) | Cod sursa (job #3267095) | Cod sursa (job #1979384) | Cod sursa (job #2227186) | Cod sursa (job #1380116)
#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]] > s[i])
{
pred[i] = pred[s[m]];
s[m] = i;
}
}
}
int main (void)
{
Read();
Compute();
Print();
return 0;
}