Pagini recente » Cod sursa (job #3172470) | Cod sursa (job #3152528) | Cod sursa (job #2785215) | Cod sursa (job #2616649) | Cod sursa (job #2194091)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
int a[100005] , p[100005];
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n , i ;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
vector<int>q;
q.push_back(a[1]);
p[1]=1;
vector<int>::iterator it;
for(i=2;i<=n;i++)
{
it=lower_bound(q.begin(),q.end(),a[i]);
if((*it)==a[i])
{
p[i]=it-q.begin()+1;
continue;
}
it=upper_bound(q.begin(),q.end(),a[i]);
int pos=it-q.begin();
pos++;
if(it==q.end())
{
q.push_back(a[i]);
p[i]=pos;
}
else
{
p[i]=pos;
q[pos-1]=a[i];
}
}
int max1=0;
for(i=1;i<=n;i++)
{
if(p[i]>max1)max1=p[i];
}
printf("%d\n",max1);
stack<int>st;
for(i=n;i>=1;i--)
{
int j;
for(j=n;j>=1;j--)
if(p[j]==i)
{
st.push(a[j]);
break;
}
}
while(!st.empty())
{
printf("%d ",st.top());
st.pop();
}
return 0;
}