#include <bits/stdc++.h>   #pragma comment(linker,  /STACK:1000000000 )   using namespace std;   const bool db = false;   int n, m, x, y;   int a[1010][1010], b[1010][1010];   long long s[1010][1010], cs[1010][1010];   vector<pair<int, int> > ans;   char mark[1010][1010];   pair<long long, pair<int, int> > st[1010 * 1010];   int sz = 0;   long long sum(int lx, int ly, int rx, int ry) {     return s[rx][ry] + s[lx - 1][ly - 1] - s[rx][ly - 1] - s[lx - 1][ry];   }   int main() {     scanf( %d%d%d%d , &n, &m, &x, &y);     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= m; ++j) {         scanf( %d , &a[i][j]);         s[i][j] = a[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];       }     }     for (int i = 1; i <= n; ++i) {       deque<int> dq;       for (int j = 1; j < y; ++j) {         while (!dq.empty() && dq.back() > a[i][j]) dq.pop_back();         dq.push_back(a[i][j]);       }       for (int j = 1; j + y - 1 <= m; ++j) {         if (j != 1) {           if (a[i][j - 1] == dq.front()) dq.pop_front();         }         while (!dq.empty() && dq.back() > a[i][j + y - 1]) dq.pop_back();         dq.push_back(a[i][j + y - 1]);         b[i][j] = dq.front();       }     }     for (int i = 1; i + y - 1 <= m; ++i) {       deque<int> dq;       for (int j = 1; j < x; ++j) {         while (!dq.empty() && dq.back() > b[j][i]) dq.pop_back();         dq.push_back(b[j][i]);       }       for (int j = 1; j + x - 1 <= n; ++j) {         if (j != 1) {           if (b[j - 1][i] == dq.front()) dq.pop_front();         }         while (!dq.empty() && dq.back() > b[j + x - 1][i]) dq.pop_back();         dq.push_back(b[j + x - 1][i]);         cs[j][i] = dq.front();       }     }     long long tot = 1LL << 60;     for (int i = 1; i + x - 1 <= n; ++i) {       for (int j = 1; j + y - 1 <= m; ++j) {         st[sz].first = cs[i][j] =             sum(i, j, i + x - 1, j + y - 1) - 1LL * x * y * cs[i][j];         st[sz].second.first = i;         st[sz++].second.second = j;       }     }     sort(st, st + sz);     ans.reserve(n * m);     for (int it = 0; it < sz; ++it) {       int i = st[it].second.first, j = st[it].second.second;       if (mark[i][j] || mark[i + x - 1][j] || mark[i][j + y - 1] ||           mark[i + x - 1][j + y - 1]) {         continue;       }       ans.emplace_back(make_pair(i, j));       for (int di = 0; di < x; ++di) {         for (int dj = 0; dj < y; ++dj) {           mark[i + di][j + dj] = 1;         }       }     }     cout << ans.size() <<   n ;     for (int i = 0; i < ans.size(); ++i)       printf( %d %d %lld n , ans[i].first, ans[i].second,              cs[ans[i].first][ans[i].second]);     getchar();     getchar();     return 0;   }   