Pagini recente » Cod sursa (job #2957212) | Cod sursa (job #998784) | Cod sursa (job #2929722) | Cod sursa (job #860606) | Cod sursa (job #2349182)
#include <fstream>
#include <vector>
#include <algorithm>
#define limit 100005
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
long long n,mx=1,pose=limit,v[limit],q[limit],ss[limit];
pair <int,int> p[limit];
int cb(int m)
{
int msk,pos=0;
for(msk=1<<10;msk>0;msk/=2)
if(q[pos+msk]<m && pos+msk<=mx)
pos+=msk;
return pos+1;
}
int cb2(int m)
{
int msk=1<<10,pos=0;
for(;msk>0;msk/=2)
if(p[msk+pos].first<=m && pos+msk<=n && p[pos+msk].second<pose)
pos+=msk;
return pos;
}
int main()
{ //5 24 12 15 15 19
//6 2 5 7 3 4 1
int i,j,pos;
cin>>n;
for(i=1;i<=n;++i)
cin>>v[i];
q[1]=v[1]; p[1].first=1; p[1].second=1;
for(i=2;i<=n;++i)
{pos=cb(v[i]); p[i].first=pos; p[i].second=i;
if(v[i]>q[mx]) { ++mx; q[mx]=v[i];}
else
q[pos]=v[i];
} cout<<mx<<'\n';
if(mx==1){
cout<<v[1]; return 0;}
sort(p+1,p+n+1); //cout<<p[2].second<<'\n';
for(i=mx;i>=1;--i)
{
pos=cb2(i);
ss[i]=v[p[pos].second];
pose=pos;
}
for(i=1;i<=mx;++i)
cout<<ss[i]<<" ";
return 0;
}