Pagini recente » Cod sursa (job #1600831) | Cod sursa (job #756197) | Cod sursa (job #1821649) | Cod sursa (job #169599) | Cod sursa (job #661043)
Cod sursa(job #661043)
//Contacteaza-ma daca nu intelegi sursa
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
int main ()
{
ifstream in("scmax.in");
int N, a[100000], p[100000], l, r;
in >> N;
for (int i = 0; i < N; ++i)
in >> a[i];
in.close();
vector <int> b;
b.push_back(0);
for (int i = 1; i < N; ++i)
{
if (a[b.back()] < a[i])
{
p[i] = b.back();
b.push_back(i);
continue;
}
for (l = 0, r = b.size() - 1; l < r;)
{
int c = (l + r)/2;
if (a[b[c]] < a[i])
l = c + 1;
else
r = c;
}
if (a[b[l]] > a[i])
{
if(l > 0)
p[i] = b[l-1];
b[l] = i;
}
}
ofstream out("scmax.out");
r = b.size(); l = b.back();
out << l-1 << "\n";
stack <int> sol;
while (r--)
{
sol.push(a[l]);
l = p[l];
}
while(!sol.empty())
{
out << sol.top() << " ";
sol.pop();
}
out.close();
return 0;
}