Pagini recente » Cod sursa (job #3187786) | Borderou de evaluare (job #2689710) | Borderou de evaluare (job #3206409) | Cod sursa (job #999422) | Cod sursa (job #1043461)
#include <stdio.h>
#define NMAX 100005
using namespace std;
int P[NMAX], V[NMAX], Q[NMAX], SOL[NMAX], N, i;
int cauta(int key){
int st = 1, dr = Q[0], m, p = -1;
while(st <= dr){
m = (st + dr)/2;
if(Q[m] >= key){
p = m;
dr = m - 1;
}else{
st = m + 1;
}
}
return 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]);
}
P[1] = 1; Q[1] = V[1]; Q[0] = 1;
int poz;
for(i = 2; i <= N; i++){
poz = cauta(V[i]);
if(poz == -1){
Q[++Q[0]] = V[i];
P[i] = Q[0];
}else{
Q[poz] = V[i];
P[i] = poz;
}
}
poz = N;
for(i = Q[0]; i >= 1; i--){
while(P[poz] != i){
poz--;
}
SOL[i] = V[poz];
}
printf("%d\n", Q[0]);
for(i = 1; i <= Q[0]; i++){
printf("%d ", SOL[i]);
}
}