#include <bits/stdc++.h>   const int N = 1000 + 10;   struct tnode {     int x, y;     long long val;     tnode() {}     tnode(int _x, int _y, long long _val) {       x = _x;       y = _y;       val = _val;     }   };   int n, m, r, c;   int a[N][N], b[N][N], f[N][N];   long long sum[N][N];   int Q[N], head, tail;   std::vector<tnode> ans, out;   bool vis[N][N];   long long S(int x1, int y1, int x2, int y2) {     return sum[x2][y2] - sum[x2][y1 - 1] - sum[x1 - 1][y2] + sum[x1 - 1][y1 - 1];   }   bool cmp(const tnode& i, const tnode& j) {     if (i.val != j.val)       return i.val < j.val;     else if (i.x != j.x)       return i.x < j.x;     else       return i.y < j.y;   }   int main() {     scanf( %d%d%d%d , &n, &m, &r, &c);     for (int i = 1; i <= n; ++i)       for (int j = 1; j <= m; ++j) {         scanf( %d , &a[i][j]);         sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];       }     for (int i = 1; i <= n; ++i) {       head = tail = 0;       for (int j = 1; j <= m; ++j) {         while (head != tail && a[i][Q[tail - 1]] >= a[i][j]) {           if (--tail < 0) tail = N - 1;         }         while (head != tail && Q[head] < j - c + 1) {           if (++head == N) head = 0;         }         Q[tail++] = j;         if (tail == N) tail = 0;         if (j >= c) b[i][j - c + 1] = a[i][Q[head]];       }     }     for (int j = 1; j + c - 1 <= m; ++j) {       head = tail = 0;       for (int i = 1; i <= n; ++i) {         while (head != tail && b[Q[tail - 1]][j] >= b[i][j]) {           if (--tail < 0) tail = N - 1;         }         while (head != tail && Q[head] < i - r + 1) {           if (++head == N) head = 0;         }         Q[tail++] = i;         if (tail == N) tail = 0;         if (i >= r) f[i - r + 1][j] = b[Q[head]][j];       }     }     for (int i = 1; i + r - 1 <= n; ++i)       for (int j = 1; j + c - 1 <= m; ++j) {         ans.push_back(tnode(             i, j, S(i, j, i + r - 1, j + c - 1) - (long long)f[i][j] * r * c));       }     std::sort(ans.begin(), ans.end(), cmp);     for (int i = 0; i < ans.size(); ++i) {       if (vis[ans[i].x][ans[i].y]) continue;       out.push_back(ans[i]);       for (int j = std::max(1, ans[i].x - r + 1); j <= ans[i].x + r - 1; ++j)         for (int k = std::max(1, ans[i].y - c + 1); k <= ans[i].y + c - 1; ++k)           vis[j][k] = true;     }     printf( %d n , out.size());     for (int i = 0; i < out.size(); ++i) {       printf( %d %d %I64d n , out[i].x, out[i].y, out[i].val);     }     return 0;   }   