Pagini recente » Cod sursa (job #2736499) | Cod sursa (job #1864647) | Cod sursa (job #1668474) | Cod sursa (job #1916622) | Cod sursa (job #1895018)
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int v[N],d[N],Ind[N],last[N],L,Pos,p;
stack <int> st;
int Search(int x){
p=0, Pos=1;
while(Pos<L) Pos<<=1;
while(Pos){
if(p+Pos<=L and x>d[p+Pos]) p+=Pos;
Pos>>=1;
}
return p;
}
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",&v[i]);
p=Search(v[i]);
last[i]=Ind[p];
if(p+1>L or v[i]<d[p+1]){
if(p+1>L) L=p+1;
d[p+1]=v[i];
Ind[p+1]=i;
}
}
printf("%d\n",L);
p=Ind[L];
while(p!=0){
st.push(v[p]);
p=last[p];
}
while(!st.empty()){
printf("%d ",st.top());
st.pop();
}
printf("\n");
return 0;
}