Pagini recente » Cod sursa (job #1798850) | Cod sursa (job #1892964) | Cod sursa (job #277536) | Cod sursa (job #1715150) | Cod sursa (job #1209743)
#include<fstream>
#include<list>
using namespace std;
#define NMAX 100005
ifstream fin("scmax.in");
ofstream fout("scmax.out");
list <int> v;
list <int>::reverse_iterator it;
int n,m,nr,num,a[NMAX],b[NMAX],A[NMAX],B[NMAX],L[NMAX],V[NMAX];
int ap[256],p[4]={0,8,16,24};
inline void update(int p, int x)
{
for (;p<=n;p+=(p&-p))
V[p]=max(x,V[p]);
}
inline int maxim(int p)
{
int Max=0;
for (;p>0;p-=(p&-p))
Max=max(Max,V[p]);
return Max;
}
inline int cauta(int x)
{
int st,dr,mij;
st=1, dr=n;
while (st<=dr)
{
mij=st+((dr-st)>>1);
if (x==b[mij]) return B[mij];
else
{
if (x<b[mij]) dr=mij-1;
else st=mij+1;
}
}
return 0;
}
int main()
{
int i,j;
fin>>n;
for (i=1;i<=n;++i)
{
fin>>a[i];
b[i]=a[i];
}
for (j=0;j<4;++j)
{
for (i=0;i<256;++i)
ap[i]=0;
for (i=1;i<=n;++i)
++ap[(b[i]>>p[j])&255];
for (i=1;i<256;++i)
ap[i]+=ap[i-1];
for (i=n;i>0;--i)
B[ap[(b[i]>>p[j])&255]]=b[i], --ap[(b[i]>>p[j])&255];
for (i=1;i<=n;++i)
b[i]=B[i];
}
m=0;
for (i=1;i<=n;++i)
if (b[i]!=b[i-1])
B[i]=++m;
else
B[i]=m;
for (i=1;i<=n;++i)
{
A[i]=cauta(a[i]);
nr=maxim(A[i]-1);
update(A[i],++nr);
L[i]=nr;
num=max(num,nr);
}
fout<<num<<"\n";
for (i=n;i>0 && num;--i)
if (L[i]==num)
{
v.push_back(a[i]);
--num;
}
for (it=v.rbegin();it!=v.rend();++it)
fout<<*it<<" ";
fout<<"\n";
return 0;
}