Pagini recente » Borderou de evaluare (job #321825) | Borderou de evaluare (job #1098679) | Borderou de evaluare (job #2359128) | Borderou de evaluare (job #1976059) | Cod sursa (job #3231789)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n,i,j,a[100005],b[100005],poz[100005],poz2[100005],k,p,st,dr,mij;
int main()
{
cin>>n;
for(i=1; i<=n; i++)
cin>>a[i];
k=1;
b[k]=a[1];
poz[1]=1;
for(i=2;i<=n;i++)
if(a[i]>=b[k])
{
if(a[i]>b[k])
{
b[++k]=a[i];
poz[i]=k;
}
}
else
{
st=1;
dr=k;
p=k+1;
while(st<=dr)
{
mij=(st+dr)/2;
if(b[mij]>a[i])
{
p=mij;
dr=mij-1;
}
else
st=mij+1;
}
b[p]=a[i];
poz[i]=p;
}
j=n;
for(i=k;i>=1;i--)
{
while(poz[j]!=i)
j--;
poz2[i]=j;
}
cout<<k<<'\n';
for(i=1;i<=k;i++)
cout<<a[poz2[i]]<<' ';
return 0;
}