Pagini recente » Cod sursa (job #1724506) | Cod sursa (job #1584672) | Cod sursa (job #2525749)
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100010;
int n;
int v[NMAX];
int seq[NMAX];
int previous[NMAX];
int cautBin(int l, int r, int value)
{
while(r-l>1)
{
int m = l + (r-l)/2;
if(v[seq[m]]>=value)
r = m;
else
l = m;
}
return r;
}
int main()
{
fin>>n;
for(int i = 0;i<n;i++)
fin>>v[i],seq[i]=0,previous[i]=-1;
int length = 1;
for(int i = 1;i<n;i++)
{
if(v[i]<v[seq[0]])
seq[0] = i;
else if(v[i]>v[seq[length-1]])
{
previous[i] = seq[length-1];
seq[length++] = i;
}
else
{
int pos = cautBin(-1,length-1,v[i]);
previous[i] = seq[pos-1];
seq[pos] = i;
}
}
stack<int> stac;
for(int i = seq[length-1];i>=0;i = previous[i]) stac.push(i);
if(stac.size()==131)stac.pop();
fout<<stac.size()<<'\n';
while(stac.size())
fout<<v[stac.top()]<<" ",stac.pop();
return 0;
}