Proff_Ust

sum_matrix_dyn

Dec 7th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. int** precomputeMatrix(int** matrix, int n, int m)
  6. {
  7.     int** sumMatrix = new int*[n];
  8.     for(int i = 0;i<n;i++)
  9.         sumMatrix[i] = new int[m];
  10.     for (int i = 0; i < n; i++) {
  11.         for (int j = 0; j < m; j++)
  12.         {
  13.             if (i == 0 && j == 0)
  14.             { // первая ячейка
  15.                 sumMatrix[i][j] = matrix[i][j];
  16.             }
  17.             else if (j == 0)
  18.             { // ячейка в первой колонке
  19.                 sumMatrix[i][j] = sumMatrix[i-1][j] + matrix[i][j];
  20.             } else if (i == 0)
  21.             { // ячейка в первом ряду
  22.                 sumMatrix[i][j] = sumMatrix[i][j-1] + matrix[i][j];
  23.             } else
  24.             {
  25.                 sumMatrix[i][j] = sumMatrix[i-1][j] +
  26.                 sumMatrix[i][j-1] - sumMatrix[i-1][j-1] +
  27.                 matrix[i][j];
  28.             }
  29.         }
  30.     }
  31.     return sumMatrix;
  32. }
  33.  
  34. int computeSum(int** sumMatrix, int i1, int i2, int j1, int j2) {
  35.     if (i1 == 0 && j1 == 0)
  36.     { // начинаем с ряда 0, колонки 0
  37.         return sumMatrix[i2][j2];
  38.     }
  39.     else if (i1 == 0)
  40.         { // начинаем с ряда 0
  41.             return sumMatrix[i2][j2] - sumMatrix[i2][j1-1];
  42.         }
  43.         else if (j1 == 0)
  44.             { // начинаем с колонки 0
  45.                 return sumMatrix[i2][j2] - sumMatrix[i1-1][j2];
  46.             }
  47.             else
  48.             {
  49.                 return sumMatrix[i2][j2] - sumMatrix[i2][j1-1] - sumMatrix[i1-1][j2] + sumMatrix[i1-1][j1-1];
  50.             }
  51. }
  52. int main()
  53. {
  54.     setlocale(0,"Russian");
  55.     ifstream InputFile("input.txt");
  56.     ofstream OutputFile("output.txt");
  57.     int m, n;
  58.     InputFile >> n;
  59.     InputFile >> m;
  60.     int ** a = new int*[n];
  61.     for (int i=0;i<n;i++)
  62.         a[i]= new int[m];
  63.  
  64.     for(int i=0;i<n;i++)
  65.         for(int j=0;j<m;j++)
  66.             InputFile >> a[i][j];
  67.  
  68.     int** matrix = precomputeMatrix(a, n, m);
  69.  
  70.     int q;
  71.     InputFile >> q;
  72.     int lx, ly, rx, ry;
  73.     int sum;
  74.     for(int k=0; k<q; k++)
  75.     {
  76.         InputFile >> lx;
  77.         InputFile >> ly;
  78.         InputFile >> rx;
  79.         InputFile >> ry;
  80.         sum = computeSum(matrix, lx-1, rx-1, ly-1, ry-1);
  81.         OutputFile << sum << endl;
  82.     }
  83.     return 0;
  84. }
Add Comment
Please, Sign In to add comment