func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 3005;   int prv[maxn], nxt[maxn], cnt[maxn];   int le[maxn];   int r, c, n, k;   vector<int> pos[maxn];   signed main(void) {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> r >> c >> n >> k;     for (int i = 1; i <= n; ++i) {       int x, y;       cin >> x >> y;       pos[y].emplace_back(x);     }     long long res = 0;     for (int i = 1; i <= c; ++i) {       set<int> second;       second.insert(0);       second.insert(r + 1);       for (int j = 0; j <= r; ++j) cnt[j] = 0, le[j] = 0;       nxt[0] = r + 1;       prv[r + 1] = 0;       long long sum = 0;       for (int j = i; j <= c; ++j) {         for (int val : pos[j]) {           if (!cnt[val]) {             int l = *prev(second.lower_bound(val));             int r = *(second.upper_bound(val));             nxt[l] = val;             nxt[val] = r;             prv[r] = val;             prv[val] = l;             sum -= 1ll * le[l] * (nxt[val] - val);             second.insert(val);           }           cnt[val]++;           int cur = val, now = 0;           while (cur != 0) {             now += cnt[cur];             if (now >= k) break;             cur = prv[cur];           }           int total = cnt[val];           if (cur > le[val]) {             sum += 1ll * (cur - le[val]) * (nxt[val] - val);             le[val] = cur;           }           while (true) {             val = nxt[val];             total += cnt[val];             now += cnt[val];             if (val > r || total > k) break;             while (cur < val && now - cnt[cur] >= k) {               now -= cnt[cur];               cur = nxt[cur];             }             if (cur > le[val]) {               assert(now >= k);               sum += 1ll * (cur - le[val]) * (nxt[val] - val);               le[val] = cur;             }           }         }         res += sum;       }     }     cout << res;   }   