Pagini recente » Cod sursa (job #901442) | Cod sursa (job #445373) | Cod sursa (job #2517171) | Cod sursa (job #3270245) | Cod sursa (job #557916)
Cod sursa(job #557916)
#include <stdio.h>
#define maxn 100005
#define infinit 1<<30
int A[maxn],Q[maxn],P[maxn];
int N,Lg;
void citire(void)
{ FILE *fin =fopen("scmax.in","r");
int i;
fscanf(fin,"%d",&N);
for(i=1; i<=N; ++i) fscanf(fin,"%d",A+i);
fclose(fin);
}
int cauta(int x)
{ int i,step;
for(step=1; step<Lg; step<<=1);
for(i=0; step; step>>=1)
if(i+step<=Lg && Q[i+step]<x)
i+=step;
if(Q[i]<x) ++i;
return i;
}
void solve(void)
{ int i,poz,k;
for(i=1; i<=N; ++i)
{ poz=cauta(A[i]);
Q[poz]=A[i];
if(poz>Lg) Lg=poz;
P[i]=poz;
}
for(i=Lg,k=N; i; --i)
{ while(P[k]!=i) --k;
Q[i]=A[k];
}
}
void scrie(void)
{ FILE *fout=fopen("scmax.out","w");
int i;
fprintf(fout,"%d\n",Lg);
for(i=1;i<=Lg;++i) fprintf(fout,"%d ",Q[i]);
fclose(fout);
}
int main(void)
{ citire();
solve();
scrie();
return 0;
}