Pagini recente » Cod sursa (job #2551667) | Cod sursa (job #3194526) | Cod sursa (job #103256) | Cod sursa (job #1644013) | Cod sursa (job #2141564)
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 100001
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector< int > previous,BEST,a;
int N,bmax;
void buildSolution(int last)
{
if(last>0)
{
buildSolution(previous[last]);
fout<<a[last]<<" ";
}
}
void write()
{
fout<<BEST.size()-1<<'\n';
buildSolution(BEST.back());
fout<<endl;
}
int binarySearch(int st,int dr,int val)
{
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(val>a[BEST[mij]])
{
st=mij+1;
bmax=mij;
}
else dr=mij-1;
}
return bmax;
}
void solve()
{
for(int i =2 ; i <= N; i++)
if(a[i] > a[BEST.back()])
{
previous[i]=BEST[BEST.size()-1];
BEST.push_back(i);
}
else
{
bmax=binarySearch(0,BEST.size()-1,a[i]);
BEST[bmax+1]=i;
previous[i]=BEST[bmax];
}
}
void read()
{
fin>>N;
a.assign(N+1,0);
previous.assign(N+2,0);
BEST.assign(2,0);
for(int i =1 ; i <= N; i++)
fin>>a[i];
BEST[1]=1;
}
int main()
{
read();
solve();
write();
}