Pagini recente » Cod sursa (job #1322704) | Cod sursa (job #425385) | Cod sursa (job #2532534) | Cod sursa (job #3217275) | Cod sursa (job #2929923)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n,v[100003],best[100003],p[100003],maxim,k,L[100003],nr;
void afisare(int i){
if(p[i]>0)
afisare(p[i]);
cout<<v[i]<<" ";
}
int cautare(int x){
int st=0,dr=nr,mij=(dr+st)/2;
while(st<=dr){
if(v[L[mij]]<x && v[L[mij+1]]>=x)
return mij;
else if(v[L[mij+1]]<x)
st=mij+1,mij=(st+dr)/2;
else
dr=mij-1,mij=(st+dr)/2;
}
return nr;
}
int main()
{
int i,j,poz;
cin>>n;
for(int i=1;i<=n;++i)
cin>>v[i];
nr=1;
best[1]=L[1]=1;
L[0]=0;
for(i=2;i<=n;++i){
poz=cautare(v[i]);
p[i]=L[poz];
best[i]=poz+1;
L[poz+1]=i;
if(nr<poz+1)
nr=poz+1;
}
maxim=0,poz=0;
for(i=1;i<=n;++i){
if(maxim<best[i])
maxim=best[i],poz=i;
}
cout<<maxim<<'\n';
afisare(poz);
return 0;
}