Pagini recente » Cod sursa (job #385728) | Cod sursa (job #1921247) | Cod sursa (job #2271764) | Cod sursa (job #2029960) | Cod sursa (job #1682390)
#include<stdio.h>
int k;
int v[100001];
int l[100001];
int stiv[100001];
int find (int st, int dr,int val){
int mij ;
while (st <= dr){
mij = (st+dr)/2;
if (val <= stiv[mij])
st = mij + 1;
if (val > stiv[mij])
dr = mij - 1;
}
return st;
}
int main (){
FILE *in,*out;
in = fopen ("scmax.in","r");
out = fopen ("scmax.out","w");
int n,i,k,lmax,poz;
fscanf (in,"%d",&n);
for (i=1;i<=n;i++)
fscanf(in,"%d",&v[i]);
l[n] = 1;
lmax = 0;
k = 1; stiv[k] = v[n];
for (i=n-1;i>=1;i--){
// cautare binara
poz = find (1,k, v[i]);// de actualizat
l[i] = poz;
if (v[i] > stiv[poz])
stiv[poz] = v[i];
if (l[i] > lmax){
lmax = l[i];
k ++;
}
}
fprintf (out,"%d\n",lmax);
i = 1;
int j;
for (j=lmax;j>=1;j--){
while (l[i] != j)
i ++;
fprintf (out,"%d ",v[i]);
}
fclose (in);
fclose (out);
return 0;
}