Pagini recente » Cod sursa (job #2373278) | Cod sursa (job #2326759) | Cod sursa (job #669162) | Cod sursa (job #1052203) | Cod sursa (job #988769)
Cod sursa(job #988769)
#include <cstdio>
#define FOR(i,a,b) for(int i= (a) ; i <= (b); ++i)
#define Nmax 100666
int D[ Nmax ],L[ Nmax ],best[ Nmax ],dupa[ Nmax ],besti[ Nmax ],n,nrb=1;
void update(int poz){
int li = 1,lf = nrb,m;
while(li <= lf){ // caut binar unde pot plasa val curenta
m = li + (lf - li) / 2;
if( best[ m ] < D[ poz ] ) li = m + 1;
else if(best[ m ] >= D[ poz ])lf = m - 1;
}
if(lf + 1 > nrb)++nrb;
if(best[lf + 1] > D[ poz ]){
best[lf + 1] = D[ poz ];
besti[lf + 1] = poz; // imi notez tatal valorii la update
}
L[ poz ] = lf + 1; // actualizez lungimea valorii curente
dupa[ poz ]=besti[ lf ]; // notez tatal valorii curente
}
void afish(){
n = besti[ nrb ]; // fol n sa tin minite lungimea scmax
besti[ 0 ] = nrb; // retin si aici lungimea scmax
do{// scriu solutia in ordine inversa
best[ nrb-- ] = D[n];
n=dupa[n];
}while(dupa[n]);
printf("%d\n",besti[ 0 ]);
FOR(i,1,besti[0])printf("%d ",best[ i ]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d\n",&n);
FOR(i, 1, n){
scanf("%d",&D[ i ]);
best[ i ] = 2000000666;
update(i);
}
afish();
return 0;
}