Вы должны внести следующие изменения в свой код.
Прежде всего размер массива, используемого для хранения данных в сегментарной структуре данных, должен быть в 4 раза больше размера данного массива. Здесь почему?
st = new int [ 4 * arr.length - 1];
Далее в функции search
третий параметр для rmq
должен быть arr.length - 1
.
static int search(int left, int right) {
return rmq(0, 0, arr.length - 1, left, right);
}
И, наконец,Вы должны исправить базовые случаи и аргументы в дочерних вызовах в функции rmq
следующим образом:
static int rmq(int pos, int left, int right, int qleft, int qright) {
if((qleft > right) || (qright < left))
return Integer.MAX_VALUE;
if((qleft <= left) && (qright >= right))
return st[pos];
int mid = (left + right) / 2;
int l = rmq(left(pos), left, mid, qleft, Math.min(qright, mid) );
int r = rmq(right(pos), mid + 1, right, Math.max(mid + 1, qleft), qright);
return (l > r) ? r : l;
}
Надеюсь, это поможет.