Pagini recente » Cod sursa (job #379740) | Cod sursa (job #453604) | Cod sursa (job #135031) | Cod sursa (job #1773170) | Cod sursa (job #2262740)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector <int> v,a,previ;
int uper_bound(int x)
{
int low=0,high=a.size()-1;
int mid=(low+high)/2;
while(low<high)
{
if(v[a[mid]]<x)
{
low=mid;
}
else
high=mid;
}
return low;
}
int main()
{
int n;
fin>>n;
for(int i=0;i<n;i++)
{
int x;
fin>>x;
v.push_back(x);
}
a.push_back(0);
previ.push_back(-1);
for(int i=1;i<n;i++)
{
if(v[i]>v[a.back()])
{
previ.push_back(a.back());
a.push_back(i);
}
else
{
int it=uper_bound(v[i]);
previ.push_back(a[it-1]);
if(it!=0 && a[it-1]!=v[i])
{
a[it]=i;
}
else if(it==0)
a[it]=i;
}
}
stack <int> st;
fout<<a.size()<<"\n";
for(int i=previ.size()-1;i>=0;i=previ[i])
st.push(v[i]);
while(!st.empty())
{
fout<<st.top()<<" ";
st.pop();
}
return 0;
}