// C# program for the above approach. using System; public class GFG{ // Declaring size of the array static readonly int L = 4; // Layer static readonly int R = 4; // Row static readonly int C = 4; // Column // Calculating prefix sum array static void prefixSum3d( int [,,] arr, int [,,] prefixSum) { // Step 0: prefixSum[0,0,0] = arr[0,0,0]; // Step 1: Filling the first row, // column, and pile of ceils. // Using prefix sum of 1d array for (int i = 1; i < L; i++) prefixSum[i,0,0] = prefixSum[i - 1,0,0] + arr[i,0,0]; for (int i = 1; i < R; i++) prefixSum[0,i,0] = prefixSum[0,i - 1,0] + arr[0,i,0]; for (int i = 1; i < C; i++) prefixSum[0,0,i] = prefixSum[0,0,i - 1] + arr[0,0,i]; // Step 2: Filling the cells // of sides(made up using cells) // which have common element arr[0,0,0]. // using prefix sum on 2d array for (int k = 1; k < L; k++) { for (int i = 1; i < R; i++) { prefixSum[k,i,0] = arr[k,i,0] + prefixSum[k - 1,i,0] + prefixSum[k,i - 1,0] - prefixSum[k - 1,i - 1,0]; } } for (int i = 1; i < R; i++) { for (int j = 1; j < C; j++) { prefixSum[0,i,j] = arr[0,i,j] + prefixSum[0,i - 1,j] + prefixSum[0,i,j - 1] - prefixSum[0,i - 1,j - 1]; } } for (int j = 1; j < C; j++) { for (int k = 1; k < L; k++) { prefixSum[k,0,j] = arr[k,0,j] + prefixSum[k - 1,0,j] + prefixSum[k,0,j - 1] - prefixSum[k - 1,0,j - 1]; } } // Step 3: Filling value // in remaining cells using formula for (int k = 1; k < L; k++) { for (int i = 1; i < R; i++) { for (int j = 1; j < C; j++) { prefixSum[k,i,j] = arr[k,i,j] + prefixSum[k - 1,i,j] + prefixSum[k,i - 1,j] + prefixSum[k,i,j - 1] - prefixSum[k - 1,i - 1,j] - prefixSum[k,i - 1,j - 1] - prefixSum[k - 1,i,j - 1] + prefixSum[k - 1,i - 1,j - 1]; } } } } static int calculateSum( int [,,] arr, int [,,] prefixSum, int D, int E, int F, int X, int Y, int Z) { // store prefix sum up to arr[X,Y,Z]: int sum = prefixSum[X,Y,Z]; // Remove prefix sum till D, E, F. if (D > 0) { sum -= prefixSum[D - 1,Y,Z]; } if (E > 0) { sum -= prefixSum[X,E - 1,Z]; } if (F > 0) { sum -= prefixSum[X,Y,F - 1]; } // Add to compensate cells removed multiple times. if (D > 0 && E > 0) { sum += prefixSum[D - 1,E - 1,Z]; } if (E > 0 && F > 0) { sum += prefixSum[X,E - 1,F - 1]; } if (F > 0 && D > 0) { sum += prefixSum[D - 1,Y,F - 1]; } // Removing cells added twice in the above step. if (D > 0 && E > 0 && F > 0) { sum -= prefixSum[D - 1,E - 1,F - 1]; } return sum; } // Driver Code public static void Main(String[] args) { // Given 3D array: int [,,] arr = { { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } } }; // To store the prefixSum int [,,] prefixSum= new int[L,R,C]; // To calculate the prefixSum prefixSum3d(arr, prefixSum); int D, E, F, X, Y, Z; D = 1; E = 1; F = 1; X = 3; Y = 3; Z = 3; Console.Write(calculateSum(arr, prefixSum, D, E, F, X, Y, Z)); } } // This code is contributed by 29AjayKumar