Cod sursa(job #752163)
#include <vector>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
using namespace std;
const int N_MAX=100011;
int f[N_MAX];
vector<int> v, TopMax;
inline void Output(ostream& out, int x)
{
if(-1 == x)
return;
else {
Output(out, f[x]);
out<<v[x]<<" ";
}
}
int main()
{
int N, i, left, middle, right;
ifstream in("scmax.in");
ofstream out("scmax.out");
in>>N;
copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v));
fill(f, f+N, -1);
TopMax.push_back(0);
for(i=1; i < N; ++i)
{
if(v[TopMax.back()] < v[i])
{
f[i]=TopMax.back();
TopMax.push_back(i);
continue;
}
left=0; right=TopMax.size()-1;
while(left <= right)
{
middle=(left+right)>>1;
if(v[i] == v[TopMax[middle]])
break;
if(v[i] < v[TopMax[middle]])
right=middle-1;
else left=middle+1;
}
if(v[TopMax[left]] > v[i])
{
if(left)
f[i]=TopMax[left-1];
TopMax[left]=i;
}
}
out<<TopMax.size()<<'\n';
Output(out, TopMax.back());
return EXIT_SUCCESS;
}