Pagini recente » Cod sursa (job #2289483) | Cod sursa (job #176470) | Cod sursa (job #2108729) | Cod sursa (job #2072742) | Cod sursa (job #2805612)
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[nmax],d[nmax],p[nmax],path[nmax],n,k,power=1;
void read()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>a[i];
while(power<n)
power<<=1;
}
int upperBound(int x)
{
int left=1,right=k,pos=k+1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(d[mid]>x)
pos=mid,right=mid-1;
else
left=mid+1;
}
return pos;
}
void solve()
{
k=1;
d[1]=a[1];
for(int i=2;i<=n;i++)
if(a[i]>d[k])
d[++k]=a[i],p[i]=k;
else
{
int pos=upperBound(a[i]);
d[pos]=a[i];
p[i]=pos;
}
fout<<k<<"\n";
int j=n;
for(int i=k;i>=1;i--)
{
while(p[j]!=i)
j--;
path[i]=j;
}
for(int i=1;i<=k;i++)
fout<<a[path[i]]<<" ";
}
int main()
{
read();
solve();
return 0;
}