#include #include #include #include using std::cin; using std::cout; const char endl = '\n'; const int N = 4e6 + 5; int n, m, q; template class array { private: T data[N << 2]; public: array() { std::fill(std::begin(data), std::end(data), 0); } T* operator[](int x) { return data + x * m; } }; array g; array up, down, sum; void pushup(int u, int ls, int rs, int l, int r) { std::deque q1, q2; for (int i = 1, j = 1; i <= m; i++) { while (!q1.empty() && down[ls][i] < down[ls][q1.back()]) q1.pop_back(); while (!q2.empty() && up[rs][i] < up[rs][q2.back()]) q2.pop_back(); q1.emplace_back(i); q2.emplace_back(i); while (j <= i && i - j + 1 > up[rs][q2.front()] + down[ls][q1.front()]) { j++; if (q1.front() < j) q1.pop_front(); if (q2.front() < j) q2.pop_front(); } sum[u][i] = std::max({sum[ls][i], sum[rs][i], i - j + 1}); } for (int i = 1; i <= m; i++) { up[u][i] = up[ls][i] + (up[ls][i] == l ? up[rs][i] : 0); down[u][i] = down[rs][i] + (down[rs][i] == r ? down[ls][i] : 0); } } void build(int u, int l, int r) { if (l == r) { for (int i = 1; i <= m; i++) { up[u][i] = down[u][i] = sum[u][i] = g[l][i]; } return; } int mid = (l + r) >> 1; build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r); pushup(u, u << 1, u << 1 | 1, mid - l + 1, r - mid); } void modify(int u, int l, int r, int p, int y) { if (l == r) { up[u][y] = down[u][y] = sum[u][y] = g[p][y] ^= 1; return; } int mid = (l + r) >> 1; if (p <= mid) modify(u << 1, l, mid, p, y); else modify(u << 1 | 1, mid + 1, r, p, y); pushup(u, u << 1, u << 1 | 1, mid - l + 1, r - mid); } void query(int u, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) { pushup(0, 0, u, l - ql, r - l + 1); return; } int mid = (l + r) >> 1; if (ql <= mid) query(u << 1, l, mid, ql, qr); if (qr > mid) query(u << 1 | 1, mid + 1, r, ql, qr); } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> q; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> g[i][j]; } } build(1, 1, n); while (q--) { int op; cin >> op; if (op == 0) { int x, y; cin >> x >> y; modify(1, 1, n, x, y); } else { // op == 1 int l, s, r, t, ans = 0; cin >> l >> s >> r >> t; for (int i = 1; i <= m; i++) { up[0][i] = down[0][i] = sum[0][i] = 0; } query(1, 1, n, l, r); for (int i = s; i <= t; i++) { ans = std::max(ans, std::min(sum[0][i], i - s + 1)); } cout << ans << endl; } } return 0; }