Pagini recente » Cod sursa (job #259914) | Cod sursa (job #2898424) | Cod sursa (job #716377) | Cod sursa (job #337871) | Cod sursa (job #1277590)
#include <fstream>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=100001;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[N],pd[N],nex[N];
inline void integrare(int k,int &nr)
{
int st=2,dr=nr,mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(pd[mij]>=k&&pd[mij-1]<k)
{
pd[mij]=k;
nex[mij]=pd[mij-1];
return ;
}
else if(pd[mij]>k) dr=mij-1;
else if(pd[mij]<k) st=mij+1;
}
}
inline void stabilire(int k,int &nr)
{ if(k<pd[1]) pd[1]=k;
else if(k<pd[nr]) integrare(k,nr);
else if(k>pd[nr])
{
pd[++nr]=k;
nex[nr]=pd[nr-1];
}
}
int main()
{
int n,i;
fin>>n;
for(i=1;i<=n;i++) pd[i]=2000000001;
for(i=1;i<=n;i++) fin>>v[i];
pd[1]=v[1];
int nr=1;
for(i=2;i<=n;i++)
{
stabilire(v[i],nr);
}
fout<<nr<<"\n";
for(i=2;i<=nr;i++) fout<<nex[i]<<" ";
fout<<pd[nr];
}