Pagini recente » Cod sursa (job #369838) | Cod sursa (job #2718649) | Cod sursa (job #2590670) | Cod sursa (job #2493242) | Cod sursa (job #2498577)
#include <stdio.h>
using namespace std;
int v[100005], best[100005], p[100005], maxim, k, L[100005], nr, n;
int binsearch(int x){
int p = 0, u = nr, m =(p + u) / 2;
while(p <= u){
if(v[L[m]] < x && v[L[m+1]] >= x) return m; // am gasit locul unde vrem sa inseram
else if(v[L[m+1]] < x){
p = m + 1;
m = (p+u)/2;
}
else{
u = m-1;
m = (p+u)/2;
}
}
return nr; // n-am gasit, returnam ultimul index
}
void afis(int i){
if(p[i] > 0) afis(p[i]);
printf("%d ", v[i]);
}
int main(){
int poz;
nr = 1;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", v + i);
best[1] = L[1] = 1;
L[0] = 0;
for(int i = 2; i <= n; i++){
poz = binsearch(v[i]);
p[i] = L[poz];
best[i] = poz + 1;
L[poz + 1] = i;
if(nr < poz + 1) nr = poz + 1; // incrementam nr daca am adaugat un element
}
maxim = 0, poz = 0;
for(int i = 1; i <= n; i++)
if(maxim < best[i]) {
maxim = best[i];
poz = i;
}
printf("%d\n", maxim);
afis(poz);
}