Pagini recente » Cod sursa (job #545722) | Cod sursa (job #223235) | Cod sursa (job #2290921) | Cod sursa (job #2630627) | Cod sursa (job #2252139)
#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];
}
cout<<k<<'\n';
Max=k;
for(i=n;i>=1;i--)
if(l[i]==k){
poz=i;
break;
}
Max=k;
while(k>0){
so[k]=v[poz];
poz=tata[poz];
k--;
}
for(i=1;i<=Max;i++)
cout<<so[i]<<" ";
return 0;
}