Pagini recente » Cod sursa (job #1942677) | Cod sursa (job #553829) | Cod sursa (job #467614) | Cod sursa (job #2136465) | Cod sursa (job #2369779)
#include<bits/stdc++.h>
#define MAXN 100001
int sol[MAXN], poz[MAXN], v[MAXN];
int solv[MAXN];
int cautbin(int st, int dr, int x){
int mij, ans;
ans=-1;
while(st<=dr){
mij=(st+dr)/2;
// if(x==13)
// printf("%d %d\n", mij, v[1]);
if(sol[mij]>x){
ans=mij;
dr=mij-1;
}
else
st=mij+1;
}
return ans;
}
int main(){
FILE*fin=fopen("scmax.in", "r");
FILE*fout=fopen("scmax.out", "w");
int i, n, rez, pas, m, p, k;
fscanf(fin, "%d", &n);
for(i=1; i<=n; i++)
fscanf(fin, "%d", &v[i]);
m=0;
for(i=1; i<=n; i++){
if(m==0){
m++;
sol[m]=v[i];
poz[i]=1;
}
else{
// if(i==5)
// for(k=1; k<=m; k++)
// printf("%d ", sol[k]);
// printf("%d %d %d\n", i, v[i], v[m]);
if(v[i]>sol[m]){
m++;
sol[m]=v[i];
poz[i]=m;
}
else{
p=cautbin(1, m, v[i]);
// if(v[i]==13)
// printf("x%d %d", p, m);
poz[i]=p;
sol[p]=v[i];
}
}
}
// for(i=1; i<=n; i++)
// printf("%d ", poz[i]);
fprintf(fout, "%d\n", m);
i=n;
k=m;
while(m>0 && i>0){
if(poz[i]==m){
solv[m]=v[i];
m--;
}
i--;
}
for(i=1; i<=k; i++)
fprintf(fout, "%d ", solv[i]);
return 0;
}