Pagini recente » Cod sursa (job #2470450) | Cod sursa (job #263713) | Cod sursa (job #1567748) | Cod sursa (job #24151) | Cod sursa (job #865032)
Cod sursa(job #865032)
#include <iostream>
#include <cstdio>
using namespace std;
#define Nmax 100001
int n, maxim, k , nr = 1;
int v[Nmax], p[Nmax], L[Nmax], best[Nmax];
void citire(){
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;
}
inline int search(int x){
int p = 0, u = nr, m = (p + u) >> 1;
while(p <= u){
if(v[L[m]] < x && v[L[m+1]] >= x)
return m;
else
if(v[L[m+1]] < x)
p = m + 1,
m = (p + u) >> 1;
else
u = m - 1,
m = (p + u) >> 1;
}
return nr;
}
void afis(int i){
if(p[i] > 0)
afis(p[i]);
printf("%d ", v[i]);
}
void dinamica(){
int poz;
for(int i = 2; i <= n; i++){
poz = search(v[i]);
p[i] = L[poz];
best[i] = poz + 1;
L[poz + 1] = i;
if(nr < poz + 1)
nr = poz + 1;
}
maxim = poz = 0;
for(int i = 1; i <= n; i++)
if(maxim < best[i])
maxim = best[i],
poz = i;
printf("%d\n", maxim);
afis(poz);
}
int main(){
citire();
dinamica();
return 0;
}