Pagini recente » Cod sursa (job #564113) | Cod sursa (job #1466268) | Cod sursa (job #239356) | Cod sursa (job #2435274) | Cod sursa (job #1895002)
#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){
if(L==0 or x<d[1]) return 0;
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(d[p+1]==0 or v[i]<d[p+1]){
d[p+1]=v[i];
Ind[p+1]=i;
}
if(p+1>L){
L=p+1;
last=i;
}
}
printf("%d\n",L);
while(last!=0){
st.push(v[last]);
last=prev[last];
}
while(!st.empty()){
printf("%d ",st.top());
st.pop();
}
printf("\n");
return 0;
}