update_value(&v[khi], -1, khi, x);
while (khi-2 > (ahi-bhi) &&
(x > ahi ||
- (best_val(&v[khi], min(ahi-x, bhi-y)) < best[v[khi].c].val &&
+ (v[khi].c >= 0 &&
+ best_val(&v[khi], min(ahi-x, bhi-y)) < best[v[khi].c].val &&
best_val(&v[khi-1], min(ahi-x+1, bhi-y)) < best[v[khi].c].val
)
)) {
best[b].ylo = pb;
while (pa < a2.elcnt &&
- a2.list[pa-1].start != a1.list[best[b].xhi-1].start)
+ (pa == 0 || a2.list[pa-1].start != a1.list[best[b].xhi-1].start))
pa++;
if (pa == a2.elcnt && best[b].xhi != a1.elcnt)
abort();
while (pb < b2.elcnt &&
- b2.list[pb-1].start != b1.list[best[b].yhi-1].start)
+ (pb == 0 || b2.list[pb-1].start != b1.list[best[b].yhi-1].start))
pb++;
if (pb == b2.elcnt && best[b].yhi != b1.elcnt)
abort();
}
for (k = klo+1; k <= khi-1 ; k += 2) {
- if (v[k-1].x+1 >= v[k+1].x) {
+ if (v[k-1].x+1 > ahi) {
+ v[k] = v[k+1];
+ } else if (v[k+1].x - k > bhi || v[k-1].x+1 >= v[k+1].x) {
v[k] = v[k-1];
v[k].x++;
} else {
x = v[klo].x; y = x - (klo-1);
dist = abs((ahi-x)-(bhi-y));
- if (dist <= best) {
+ if (y <= bhi && dist <= best) {
v[klo-1] = v[klo];
klo--;
} else
- while (dist > best) {
- klo++;
- x = v[klo].x;
- y = x - (klo-1);
- dist = abs((ahi-x)-(bhi-y));
- }
-
+ klo++;
x = v[khi].x+1; y = x - (khi+1);
dist = abs((ahi-x)-(bhi-y));
- if (dist <= best) {
+ if (x <= ahi && dist <= best) {
v[khi+1] = v[khi];
v[khi+1].x++;
khi++;
} else
- while (dist > best) {
- khi--;
- x = v[khi].x+1; y = x - (khi+1);
- dist = abs((ahi-x)-(bhi-y));
- }
+ khi--;
}
}