Pagini recente » Cod sursa (job #904408) | Cod sursa (job #3276426) | Cod sursa (job #2320804) | Cod sursa (job #988888) | Cod sursa (job #2252136)
#include <fstream>
using namespace std;
int l[100001],q[100001],v[100001],sol,so[100001],Max,n,i,k,tata[100001],poz;
int cautare(int x,int k){
int st,dr,mid,sol;
st=1;
dr=k;
sol=0;
while(st<=dr){
mid=(st+dr)/2;
if(v[q[mid]]>=v[x]){
sol=mid;
dr=mid-1;
}
else
st=mid+1;
}
if(sol==0)
return k+1;
return sol;
}
int main()
{
ifstream cin("scmax.in");
ofstream cout("scmax.out");
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];
Max=0;
k=0;
for(i=1;i<=n;i++){
sol=cautare(i,k);
k=max(k,sol);
q[k]=i;
l[i]=k;
tata[i]=q[k-1];
}
Max=0;
for(i=1;i<=n;i++)
if(l[i]>Max)
Max=l[i];
cout<<Max<<'\n';
k=Max;
for(i=n;i>=1;i--)
if(l[i]==k){
poz=i;
break;
}
Max=k;
while(k>0){
so[k]=poz;
poz=tata[poz];
k--;
}
for(i=1;i<=Max;i++)
cout<<v[so[i]]<<" ";
return 0;
}