func_code_string: #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;   }   