#include <bits/stdc++.h>
using namespace std;
struct node {
  int val;
  int mx[32];
};
int n, k, p;
vector<int> a[200005];
node st[4 * 200005];
int b[5];
void build(int si, int ss, int se) {
  if (ss == se) {
    st[si].val = 0;
    for (int i = 0; i < p; i++) {
      int val = 0;
      for (int j = 0; j < k; j++) {
        if (i & (1 << j)) {
          val += a[ss][j];
        } else {
          val -= a[ss][j];
        }
      }
      st[si].mx[i] = val;
    }
    return;
  }
  int mid = (ss + se) >> 1;
  build(2 * si + 1, ss, mid);
  build(2 * si + 2, mid + 1, se);
  st[si].val = max(st[2 * si + 1].val, st[2 * si + 2].val);
  for (int i = 0; i < p; i++) {
    st[si].mx[i] = max(st[2 * si + 1].mx[i], st[2 * si + 2].mx[i]);
    st[si].val =
        max(st[si].val, st[2 * si + 1].mx[i] + st[2 * si + 2].mx[(p - 1) ^ i]);
  }
  return;
}
void update(int si, int ss, int se, int ind) {
  if (ind < ss || ind > se) {
    return;
  }
  if (ss == se) {
    st[si].val = 0;
    for (int i = 0; i < p; i++) {
      int val = 0;
      for (int j = 0; j < k; j++) {
        if (i & (1 << j)) {
          val += b[j];
        } else {
          val -= b[j];
        }
      }
      st[si].mx[i] = val;
    }
    return;
  }
  int mid = (ss + se) >> 1;
  update(2 * si + 1, ss, mid, ind);
  update(2 * si + 2, mid + 1, se, ind);
  st[si].val = max(st[2 * si + 1].val, st[2 * si + 2].val);
  for (int i = 0; i < p; i++) {
    st[si].mx[i] = max(st[2 * si + 1].mx[i], st[2 * si + 2].mx[i]);
    st[si].val =
        max(st[si].val, st[2 * si + 1].mx[i] + st[2 * si + 2].mx[(p - 1) ^ i]);
  }
  return;
}
node query(int si, int ss, int se, int l, int r) {
  if (r < ss || l > se) {
    node ans;
    ans.val = -(k * 1e6 + 5);
    for (int i = 0; i < p; i++) {
      ans.mx[i] = -k * 1e6 + 5;
    }
    return ans;
  }
  if (ss >= l && se <= r) {
    return st[si];
  }
  int mid = (ss + se) >> 1;
  node x = query(2 * si + 1, ss, mid, l, r);
  node y = query(2 * si + 2, mid + 1, se, l, r);
  node ans;
  ans.val = max(x.val, y.val);
  for (int i = 0; i < p; i++) {
    ans.mx[i] = max(x.mx[i], y.mx[i]);
    ans.val = max(ans.val, x.mx[i] + y.mx[(p - 1) ^ i]);
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> k;
  p = (1 << k);
  for (int i = 0; i < n; i++) {
    a[i].resize(k);
    for (int j = 0; j < k; j++) {
      cin >> a[i][j];
    }
  }
  build(0, 0, n - 1);
  int q;
  cin >> q;
  while (q--) {
    int t;
    cin >> t;
    if (t == 1) {
      int ind;
      cin >> ind;
      ind--;
      for (int i = 0; i < k; i++) {
        cin >> b[i];
      }
      update(0, 0, n - 1, ind);
    } else {
      int l, r;
      cin >> l >> r;
      l--, r--;
      cout << query(0, 0, n - 1, l, r).val << endl;
    }
  }
  return 0;
}
