Pagini recente » Cod sursa (job #1334136) | Cod sursa (job #2103425) | Cod sursa (job #135644) | Cod sursa (job #1722195) | Cod sursa (job #485921)
Cod sursa(job #485921)
#include<algorithm>
#include<fstream.h>
using namespace std;
const int NMAX=100005;
int n,a[NMAX],d[NMAX],aib[NMAX],x[NMAX],sol[NMAX],y[NMAX];
int querry(int x)
{int mx=0;
for(;x;x-=x&(x-1)^x)
if(d[aib[x]]>d[mx])
mx=aib[x];
return mx;
}
void update(int x,int ind)
{ for(;x<=n;x+=x&(x-1)^x)
if(d[ind]>d[aib[x]])
aib[x]=ind;
}
ofstream fout("scmax.out");
void afis(int p)
{if(p)
{afis(sol[p]);
fout<<x[a[p]]<<' ';
}
}
int main()
{ifstream fin("scmax.in");
fin>>n;
int i,m=0;
for(i=1;i<=n;++i)
{fin>>a[i];x[i]=a[i];}
sort(x+1,x+n+1);
for(i=1;i<=n;++i)
if(x[i]!=x[i+1])
x[++m]=x[i];
for(i=1;i<=n;++i)
a[i]=lower_bound(x+1,x+n+1,a[i])-x;
for(i=1;i<=n;++i)
{sol[i]=querry(a[i]-1);
d[i]=d[sol[i]]+1;
update(a[i],i);
}
int p=1;
for(i=2;i<=n;++i)
if(d[i]>d[p])
p=i;
fout<<d[p]<<'\n';
afis(p);
fout<<'\n';
fin.close();
fout.close();
return 0;
}