Pagini recente » Cod sursa (job #1461070) | Cod sursa (job #984077) | Cod sursa (job #1396742) | Cod sursa (job #122513) | Cod sursa (job #1090057)
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N = 100001;
int v[N], w[N], x[N], n, i, aib[N], lung, imax, maxim, subsir[N], l[N];
bool cmp(int p1, int p2){
return v[p1] < v[p2];
}
int query(int p){
int s=0;
while(p!=0){
if(aib[p]>s)
s=aib[p];
p-=p&(-p);
}
return s+1;
}
void update(int p,int val){
while(p<=n){
aib[p] = val;
p+=p&(-p);
}
}
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&v[i]);
w[i]=i;
}
sort(w+1,w+n+1,cmp);
for(i = 1; i <= n; i++){
if(i > 1 && v[w[i]] == v[w[i-1]]){
x[w[i]] = x[w[i-1]];
} else {
x[w[i]] = i;
}
}
for(i=1;i<=n;i++){
lung=query(x[i]-1);
if(lung>maxim)
{
maxim=lung;
imax=i;
}
update(x[i],lung);
l[i]=lung;
}
printf("%d\n",maxim);
lung=maxim;
int r=0;
subsir[r] = v[imax];
for(i=n; i>=1;i--){
if(l[i]==lung-1){
subsir[++r] = v[i];
lung--;
}
}
for(i=maxim-1;i>=0;i--){
printf("%d ",&subsir[i]);
}
return 0;
}