Pagini recente » Cod sursa (job #924045) | Cod sursa (job #892336) | Cod sursa (job #2862647) | Cod sursa (job #318468) | Cod sursa (job #862419)
Cod sursa(job #862419)
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> q,p,sol;
int a[100005];
void add(int x)
{
int st,dr,med,last;
if(q.empty() || q[q.size()-1]<x)
{
q.push_back(x);
p.push_back(q.size()-1);
}
else
{
st=0;dr=q.size()-1;last=q.size()-1;
while(st<=dr)
{
med=(st+dr)/2;
if(q[med]>x)
{
last=med;
dr=med-1;
}
else
st=med+1;
}
q[last]=x;p.push_back(last);
}
}
int main()
{
freopen("lis.in","r",stdin);
freopen("lis.out","w",stdout);
int n=0,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
add(a[i]);
}
printf("%d\n",(int)q.size());
int search=(int)q.size()-1;
for(i=(int)p.size()-1;i>=0;i--)
{
if(p[i]==search)
{
sol.push_back(a[i+1]);
search--;
if(search==-1) break;
}
}
reverse(sol.begin(),sol.end());
for(vector<int>::iterator it=sol.begin();it!=sol.end();it++)
printf("%d ",*it);
return 0;
}