Pagini recente » Cod sursa (job #2320381) | Cod sursa (job #1050062) | Cod sursa (job #2438785) | Cod sursa (job #212987) | Cod sursa (job #2375362)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100002;
const int INF = ( 1 << 30 );
int N;
int a[NMAX];
int pre[NMAX];
int LIS[NMAX];
int last;
void Read()
{
fin>>N;
for(int i=1;i<=N;++i)
fin>>a[i];
fin.close();
}
int BinSearch(int lf,int rg,int poz)
{
int m = (lf+rg)/2;
if(lf>rg) return 0;
if(a[poz]>a[LIS[m]]) return max(m,BinSearch(m+1,rg,poz));
else return BinSearch(lf,m-1,poz);
}
void Out(int poz)
{
if(pre[poz])Out(pre[poz]);
fout<<a[poz]<<" ";
}
void Lis()
{
a[0]=-INF;
a[N+1]=INF;
LIS[0]=0;
last=0;
for(int i=1;i<=N;++i)
{
if(a[i]>a[LIS[last]])
{
LIS[++last]=i;
pre[i]=LIS[last-1];
}
else
{
int poz = BinSearch(1,last,i);
LIS[poz+1]=i;
pre[i]=LIS[poz];
}
}
fout<<last<<"\n";
Out(LIS[last]);
}
int main()
{
Read();
Lis();
return 0;
}