Pagini recente » Borderou de evaluare (job #1962011) | Cod sursa (job #1974689) | Borderou de evaluare (job #149733) | Borderou de evaluare (job #561683) | Cod sursa (job #1406151)
#include <fstream>
#include <vector>
#include <stack>
const int MAX_N(100001);
int n, Best, Last;
int v [MAX_N];
int Pred [MAX_N];
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)
{
std::ofstream output("scmax.out");
output << Best << '\n';
std::stack<int> stack;
for (int i(Last) ; i ; i = Pred[i])
stack.push(v[i]);
while (!stack.empty())
{
output << stack.top() << ' ';
stack.pop();
}
output.close();
}
inline void Dynamic (void)
{
std::vector<int> temp = {1};
for (int i(2) ; i <= n ; ++i)
if (v[i] > v[temp.back()])
{
Pred[i] = temp.back();
temp.push_back(i);
}
else
{
int left(0), right(temp.size()), mid((left + right) / 2);
while (left < right)
{
if (v[temp[mid]] < v[i])
left = mid + 1;
else
right = mid;
mid = (left + right) / 2;
}
if (v[i] < v[temp[mid]])
{
temp[mid] = i;
if (mid)
Pred[i] = temp[mid - 1];
}
}
Best = temp.size();
Last = temp.back();
}
int main (void)
{
Read();
Dynamic();
Print();
return 0;
}