Find Kth Largest XOR Coordinate Value

medium matrix prefix sum bit manipulation

Problem

You are given an m × n matrix. The XOR coordinate value at position (a, b) is the XOR of every element matrix[i][j] with i ≤ a and j ≤ b — that is, the XOR of the whole rectangle from the top-left corner down to (a, b). There are m × n such coordinate values. Given an integer k, return the kth largest of all these values.

Inputmatrix = [[5,2],[1,6]], k = 1
Output7
The four coordinate values are 5, 7, 4, 0. Sorted from largest they are 7, 5, 4, 0, so the 1st largest is 7.

def kth_largest_value(matrix, k):
    m, n = len(matrix), len(matrix[0])
    pre = [[0] * (n + 1) for _ in range(m + 1)]
    values = []
    for i in range(m):
        for j in range(n):
            pre[i + 1][j + 1] = matrix[i][j] ^ pre[i][j + 1] ^ pre[i + 1][j] ^ pre[i][j]
            values.append(pre[i + 1][j + 1])
    values.sort(reverse=True)
    return values[k - 1]
function kthLargestValue(matrix, k) {
  const m = matrix.length, n = matrix[0].length;
  const pre = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
  const values = [];
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      pre[i + 1][j + 1] = matrix[i][j] ^ pre[i][j + 1] ^ pre[i + 1][j] ^ pre[i][j];
      values.push(pre[i + 1][j + 1]);
    }
  }
  values.sort((a, b) => b - a);
  return values[k - 1];
}
class Solution {
    public int kthLargestValue(int[][] matrix, int k) {
        int m = matrix.length, n = matrix[0].length;
        int[][] pre = new int[m + 1][n + 1];
        int[] values = new int[m * n];
        int idx = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                pre[i + 1][j + 1] = matrix[i][j] ^ pre[i][j + 1] ^ pre[i + 1][j] ^ pre[i][j];
                values[idx++] = pre[i + 1][j + 1];
            }
        }
        Arrays.sort(values);
        return values[m * n - k];
    }
}
int kthLargestValue(vector<vector<int>>& matrix, int k) {
    int m = matrix.size(), n = matrix[0].size();
    vector<vector<int>> pre(m + 1, vector<int>(n + 1, 0));
    vector<int> values;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            pre[i + 1][j + 1] = matrix[i][j] ^ pre[i][j + 1] ^ pre[i + 1][j] ^ pre[i][j];
            values.push_back(pre[i + 1][j + 1]);
        }
    }
    sort(values.rbegin(), values.rend());
    return values[k - 1];
}
Time: O(m · n · log(m · n)) Space: O(m · n)