#include <bits/stdc++.h>
using namespace std;
const int gridSize = 1000;
long long getPairs(int n) {
  long long result = 0;
  for (int i = 1; i < n; i++) result += n - i;
  return result;
}
int main() {
  std::cout.sync_with_stdio(false);
  int n, i, x, y, j;
  cin >> n;
  bool a[gridSize + 1][gridSize + 1];
  for (i = 1; i <= gridSize; i++)
    for (j = 1; j <= gridSize; j++) a[i][j] = false;
  for (i = 0; i < n; i++) {
    cin >> x >> y;
    a[x][y] = true;
  }
  long long result = 0, attacking = 0;
  pair<int, int> startPoint(1, 1);
  for (i = 1; i <= gridSize; i++) {
    attacking = 0;
    startPoint = make_pair(1, i);
    do {
      if (a[startPoint.first][startPoint.second]) attacking++;
      startPoint.second++;
      startPoint.first++;
    } while (startPoint.second <= gridSize && startPoint.first <= gridSize);
    if (attacking > 1) result += getPairs(attacking);
  }
  for (i = 2; i <= gridSize; i++) {
    attacking = 0;
    startPoint = make_pair(i, 1);
    do {
      if (a[startPoint.first][startPoint.second]) attacking++;
      startPoint.second++;
      startPoint.first++;
    } while (startPoint.second <= gridSize && startPoint.first <= gridSize);
    if (attacking > 1) result += getPairs(attacking);
  }
  for (i = gridSize; i >= 1; i--) {
    attacking = 0;
    startPoint = make_pair(1, i);
    do {
      if (a[startPoint.first][startPoint.second]) attacking++;
      startPoint.second--;
      startPoint.first++;
    } while (startPoint.second >= 1 && startPoint.first <= gridSize);
    if (attacking > 1) result += getPairs(attacking);
  }
  for (i = 2; i <= gridSize; i++) {
    attacking = 0;
    startPoint = make_pair(i, gridSize);
    do {
      if (a[startPoint.first][startPoint.second]) attacking++;
      startPoint.second--;
      startPoint.first++;
    } while (startPoint.second >= 1 && startPoint.first <= gridSize);
    if (attacking > 1) result += getPairs(attacking);
  }
  cout << result;
  return 0;
}
