Pagini recente » Cod sursa (job #98405) | Cod sursa (job #770256) | Cod sursa (job #1441233) | Cod sursa (job #1571658) | Cod sursa (job #1895015)
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int v[N],d[N],Ind[N],prev[N],L,Pos,p,last;
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]);
prev[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);
last=Ind[L];
while(last!=0){
st.push(v[last]);
last=prev[last];
}
while(!st.empty()){
printf("%d ",st.top());
st.pop();
}
printf("\n");
return 0;
}