Pagini recente » Cod sursa (job #256429) | Cod sursa (job #114560) | Cod sursa (job #1721380) | Cod sursa (job #1882249) | Cod sursa (job #1222090)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int nmax = 100010;
int a[nmax],v[nmax],t[nmax],n,k,i;
vector<int> res;
void cauta(int x)
{
int l=1,r=k,sol;
while (l<=r) {
int mij=(l+r)/2;
if (a[v[mij]]>x) sol=mij,r=mij-1;
else l=mij+1;
}
if (x!=a[v[sol-1]])
v[sol]=i,
t[i]=v[sol-1];
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
cin>>a[i];
v[++k]=1;
for (i=2;i<=n;i++)
if (a[i]>a[v[k]]) {v[++k]=i; t[i]=v[k-1];}
else if (a[i]<a[v[k]])
cauta(a[i]);
cout<<k<<"\n"; k=v[k];
while (k)
res.push_back(a[k]),
k=t[k];
for (int i=res.size()-1;i>=0;i--) cout<<res[i]<<" ";
return 0;
}