Pagini recente » Cod sursa (job #2899583) | Cod sursa (job #973117) | Cod sursa (job #1546798) | Cod sursa (job #2211236) | Cod sursa (job #1595051)
#include <stdio.h>
#define N_MAX 100002
using namespace std;
int n;
int v[N_MAX];
int best[N_MAX];
int sir[N_MAX];
int p[N_MAX];
int nr;
inline void citire();
int findElem(int);
void afisare(int);
int main()
{
citire();
int maxi;
int poz;
best[1] = 1;
sir[1] = 1;
sir[0] = 0;
nr = 1;
for (int i = 2; i <= n; ++i){
poz = findElem(v[i]);
p[i] = sir[poz];
best[i] = poz + 1;
sir[poz+1] = i;
if (nr < poz + 1)
nr = poz + 1;
}
maxi = best[1];
poz = 1;
for (int i = 2; i <= n; ++i){
if (best[i] > maxi){
maxi = best[i];
poz = i;
}
}
printf("%d\n", maxi);
afisare(poz);
return 0;
}
inline 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);
}
int findElem(int e){
int p, u, m;
p = 0;
u = nr;
m = (p + u) / 2;
while (p <= u)
if (v[sir[m]] < e && e <= v[sir[m+1]])
return m;
else if (v[sir[m+1]] < e){
p = m + 1;
m = (p + u) / 2;
}else{
u = m - 1;
m = (p + u) / 2;
}
return nr;
}
void afisare(int i){
if (p[i] > 0) afisare(p[i]);
printf("%d ", v[i]);
}