Pagini recente » Cod sursa (job #1056551) | Cod sursa (job #746458) | Cod sursa (job #1176904) | Cod sursa (job #1137490) | Cod sursa (job #705278)
Cod sursa(job #705278)
#include <stdio.h>
#define NMAX 100001
int v[NMAX+1];
int n;
int p[NMAX+1];
int sol[NMAX+1];
void print_sol(int i) {
if (i) {
print_sol(p[i]);
printf("%d ", v[i]);
}
}
int tree[NMAX+1];
void solve_aib() {
int i, j, max=0, imax, idx, cand;
sol[1] = 1; tree[1]=1;
for (i=2;i<=n;i++) {
idx = i-1;
while (idx) {
cand = tree[idx];
if (v[cand]<v[i] && sol[cand]>sol[i]) { sol[i] = sol[cand]; p[i] = cand; }
sol[i]++;
idx -= idx & (-idx);
}
idx = i;
while(idx<=NMAX && sol[tree[idx]]<sol[i]) {
tree[idx] = i;
idx += idx&(-idx);
}
if (sol[i]>max) {
max = sol[i];
imax = i;
}
}
printf("%d\n", max);
print_sol(imax);
}
int solve_n2() {
int i, j, max=0, imax;
sol[1] = 1;
for (i=2; i<=n;i++) {
//sol[i] = 1;
for (j=1; j<i; j++) {
if (v[j]<v[i] && sol[j]>sol[i]) {sol[i] = sol[j]; p[i]=j;}
}
sol[i]++;
if (sol[i]>max) {
max = sol[i];
imax = i;
}
}
printf("%d\n", max);
print_sol(imax);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i;
scanf("%d", &n);
for (i=1;i<=n;i++) scanf("%d", v+i);
solve_aib();
return 0;
}