Я пытаюсь понять, как применить код дерева 2D-сегмента для более высокой размерности, особенно для 3D. Потому что в уроках сказано, что деревья 2D-диапазона могут быть легко преобразованы в более высокие измерения. Что я делаю не так?
Мой код указан ниже:
private void build_Y(int vz, int lz, int rz, int vx, int lx, int rx, int vy, int ly, int ry, int a[][][]){
if (ly == ry){
if (lx == rx && lz == rz){
t[vz][vx][vy] = a[lz][lx][ly];
}
else if (lx == rx && lz != rz){
t[vz][vx][vy] = t[2 * vz][vx][vy] + t[2 * vz + 1][vx][vy];
}
else if (lx != rx && lz == rz){
t[vz][vx][vy] = t[vz][2 * vx][vy] + t[vz][2 * vx + 1][vy];
}
else if (lx != rx && lz != rz){
t[vz][vx][vy] = t[2 * vz][2 * vx][vy] + t[2 * vz + 1][2 * vx + 1][vy];
}
}else{
int vmiddleY = (ly + ry) / 2;
build_Y(vz, lz, rz, vx, lx, rx,2 * vy, ly, vmiddleY, a);
build_Y(vz, lz, rz, vx, lx, rx,2 * vy + 1, vmiddleY + 1, ry, a);
t[vz][vx][vy] = t[vz][vx][2 * vy] + t[vz][vx][2 * vy + 1];
}
}
public void build_X(int vz, int lz, int rz, int vx, int lx, int rx, int a[][][]){
if (lx != rx){
int vmiddleX = (lx + rx) / 2;
build_X(vz, lz, rz, 2 * vx, lx, vmiddleX, a);
build_X(vz, lz, rz, 2 * vx + 1, vmiddleX + 1, rx, a);
}
build_Y(vz, lz, rz, vx, lx, rx, 1, 0, 2, a);
}
public void build_Z(int vz, int lz, int rz, int a[][][]){
if (lz != rz){
int vmiddleZ = (lz + rz) / 2;
build_Z(2 * vz, lz, vmiddleZ, a);
build_Z(2 * vz + 1, vmiddleZ + 1, rz, a);
}
build_X(vz, lz, rz, 1, 0, 2, a);
}
Тестовый массив:
int[][][] a = {
{ {0, 1, 0}, {0, 0, 1}, {1, 0, 1} },
{ {0, 1, 0}, {0, 0, 1}, {1, 0, 1} },
{ {0, 0, 0}, {0, 0, 1}, {1, 0, 1} },
};
Мой код дает мне результат общей суммы = 6, но должен быть 11.