using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray(); static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, k, p) = ((int)c[0], (int)c[1], c[2]); var map = NMap(k); var INF = int.MaxValue / 2; var dp = new int[n][]; for (var i = 0; i < n; ++i) { dp[i] = new int[i + 1]; for (var j = 0; j <= i; ++j) dp[i][j] = INF; } var q = new Queue<(int x, int y)>(); foreach (var pt in map) { dp[pt[0]][pt[1]] = 0; q.Enqueue((pt[0], pt[1])); } var mx = new int[] { -1, -1, 0, 0, 1, 1 }; var my = new int[] { -1, 0, -1, 1, 0, 1 }; while (q.Count > 0) { var cur = q.Dequeue(); for (var i = 0; i < mx.Length; ++i) { var nx = cur.x + mx[i]; var ny = cur.y + my[i]; if (nx < 0 || nx >= n || ny < 0 || ny > nx) continue; if (dp[nx][ny] <= dp[cur.x][cur.y] + 1) continue; dp[nx][ny] = dp[cur.x][cur.y] + 1; q.Enqueue((nx, ny)); } } // WriteLine(string.Join("\n", dp.Select(di => string.Join(" ", di)))); var c1 = new long[n]; // 右上 var c2 = new long[n]; // 左上 var c3 = new long[n]; // 下 var c4 = new long[n, n]; // 上 var c5 = new long[n, n]; // 左下 var c6 = new long[n, n]; // 右下 var all = 0L; for (var i = 0; i < n; ++i) for (var j = 0; j <= i; ++j) { c1[i - j] += dp[i][j]; c2[j] += dp[i][j]; c3[n - i - 1] += dp[i][j]; all += dp[i][j]; } for (var i = 1; i < n; ++i) { c1[i] += c1[i - 1]; c2[i] += c2[i - 1]; c3[i] += c3[i - 1]; } // WriteLine($"c1: {string.Join(" ", c1)}"); // WriteLine($"c2: {string.Join(" ", c2)}"); // WriteLine($"c3: {string.Join(" ", c3)}"); for (var j = 0; j < n; ++j) { var sub = 0L; for (var i = j; i < n; ++i) { sub += dp[i][j]; c4[i, j] = sub; if (j > 0) c4[i, j] += c4[i - 1, j - 1]; } } for (var i = n - 1; i >= 0; --i) { var sub = 0L; for (var j = 0; j <= i; ++j) { sub += dp[i][j]; c5[i, j] = sub; if (i < n - 1) c5[i, j] += c5[i + 1, j]; } } for (var i = n - 1; i >= 0; --i) { var sub = 0L; for (var j = i; j >= 0; --j) { sub += dp[i][j]; c6[i, j] = sub; if (i < n - 1) c6[i, j] += c6[i + 1, j + 1]; } } var ans = 0L; for (var i = 0; i < n; ++i) for (var j = 0; j <= i; ++j) { // WriteLine($"i = {i}, j = {j}"); if (dp[i][j] >= p) { // WriteLine($" A: 0 to {n-i-1}"); ans += n - i - 1; } else { var max = Calc(n, i, j, n - i - 1, all, c1, c2, c3, c4, c5, c6); if (max >= p) { var ok = n - i - 1; var ng = 0; while (ok - ng > 1) { var mid = (ok + ng) / 2; var tmp = Calc(n, i, j, mid, all, c1, c2, c3, c4, c5, c6); if (tmp >= p) ok = mid; else ng = mid; } ans += n - i - ok; // WriteLine($" B: {ok} to {n-i-1} ({n-i-ok})"); } // else WriteLine($" C"); } } WriteLine(ans); } static long Calc(int n, int i, int j, int len, long all, long[] c1, long[] c2, long[] c3, long[,] c4, long[,] c5, long[,] c6) { // Write($"i={i}, j={j}, len={len}"); var dx = i + len; var ly = j; var ry = j + len; var ans = all; if (i > j) { ans -= c1[i - j - 1]; // Write($" -c1 {c1[i-j-1]}"); } if (j > 0) { ans -= c2[j - 1]; // Write($" -c2 {c2[j - 1]}"); } if (dx + 1 < n) { ans -= c3[n - 2 - dx]; // Write($" -c3 {c3[n-2-dx]}"); } var x4 = i - 2; var y4 = j - 1; if (x4 >= 0 && y4 >= 0) { ans += c4[x4, y4]; // Write($" +c4 {c4[x4, y4]}"); } var x5 = dx + 1; var y5 = ly - 1; if (x5 < n && y5 >= 0) { ans += c5[x5, y5]; // Write($" +c5 {c5[x5, y5]}"); } var x6 = dx + 1; var y6 = ry + 2; if (x6 < n && y6 <= x6) { ans += c6[x6, y6]; // Write($" +c6 {c6[x6, y6]}"); } // WriteLine($" = {ans}"); return ans; } }