Pagini recente » Cod sursa (job #416) | Cod sursa (job #3138007) | Cod sursa (job #2381899) | Cod sursa (job #2439208) | Cod sursa (job #1244389)
#include <stdio.h>
#define Nmax 100005
int n;
int a[Nmax];
int best[Nmax];
int poz[Nmax];
int s[Nmax], sn;
int sir_max, poz_max;
int search(int x){
int l, r, m;
l = 0; r = sn;
while (l <= r){
m = (l + r) / 2;
if (a[s[m]] < x && x <= a[s[m + 1]]) return m;
else if (x > s[s[m]])
l = m + 1;
else
r = m - 1;
}
return sn;
}
void solve(){
int p;
sn = 0;
s[1] = 1;
for (int i = 2; i <= n; ++i){
p = search(a[i]);
poz[i] = s[p];
best[i] = p + 1;
s[p + 1] = i;
if (sn < p + 1) sn = p + 1;
}
// for (int i = 1; i <= n; ++i)
// printf("%d ", best[i]);
// printf("\n");
}
void write_sir(int i){
if (!i) return;
write_sir(poz[i]);
printf("%d ", a[i]);
}
void write(){
for (int i = 1; i <= n; ++i)
if (best[i] > sir_max){
sir_max = best[i];
poz_max = i;
}
printf("%d\n", sir_max);
write_sir(poz_max);
printf("\n");
}
int main(){
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
solve();
write();
return 0;
}