program C;
const MAXN =100000;
type elenco= array[1..MAXN] of Int64;
var N, i, h:Longint;
diffcoord, uguali:elenco;
coordinate : array[1..MAXN, 1..2] of Int64;
squares :Int64;
Procedure scambia (var a,b: Int64);
var x:Int64;
begin
x:=a;
a:=b;
b:=x;
end;
Procedure ordinamento (estremoi,estremos: Int64; var v : elenco; ordinato:boolean);
var inf, sup, medio:Int64;
pivot :Int64;
begin
inf:=estremoi;
sup:=estremos;
medio:= (estremoi+estremos) div 2;
pivot:=v[medio];
repeat
if (ordinato) then
begin
while (v[inf]<pivot) do inf:=inf+1;
while (v[sup]>pivot) do sup:=sup-1;
end;
if inf<=sup then
begin
scambia(v[inf],v[sup]);
inf:=inf+1;
sup:=sup-1;
end;
until inf>sup;
if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
end;
begin
read(N);
for i:=1 to N do
begin
readln (coordinate[i][1], coordinate[i][2]);
diffcoord[i]:=coordinate[i][1] - coordinate[i][2];
uguali[i]:=1;
end;
ordinamento (1,N,diffcoord, true);
squares:=0; h:=1; i:=1;
while i<N do
begin
if diffcoord[i]=diffcoord[i+1] then begin uguali[h]:=uguali[h]+1; i:=i+1; end
else begin i:=i+1; h:=h+1; end;
end;
for i:=1 to h do
squares:=squares+(uguali[i]*(uguali[i]-1) div 2);
writeln(squares);
end.
cHJvZ3JhbSBDOwpjb25zdCBNQVhOID0xMDAwMDA7CnR5cGUgZWxlbmNvPSBhcnJheVsxLi5NQVhOXSBvZiBJbnQ2NDsKdmFyIE4sIGksIGg6TG9uZ2ludDsKICAgIGRpZmZjb29yZCwgdWd1YWxpOmVsZW5jbzsKICAgIGNvb3JkaW5hdGUgOiBhcnJheVsxLi5NQVhOLCAxLi4yXSBvZiBJbnQ2NDsKICAgIHNxdWFyZXMgOkludDY0OwogICAgClByb2NlZHVyZSBzY2FtYmlhICh2YXIgYSxiOiBJbnQ2NCk7CnZhciB4OkludDY0OwpiZWdpbgogICB4Oj1hOwogICBhOj1iOwogICBiOj14OwplbmQ7ICAKUHJvY2VkdXJlIG9yZGluYW1lbnRvIChlc3RyZW1vaSxlc3RyZW1vczogSW50NjQ7IHZhciB2IDogZWxlbmNvOyBvcmRpbmF0bzpib29sZWFuKTsKdmFyIGluZiwgc3VwLCBtZWRpbzpJbnQ2NDsKICAgIHBpdm90IDpJbnQ2NDsKYmVnaW4KICAgIGluZjo9ZXN0cmVtb2k7CiAgICBzdXA6PWVzdHJlbW9zOwogICAgbWVkaW86PSAoZXN0cmVtb2krZXN0cmVtb3MpIGRpdiAyOwogICAgcGl2b3Q6PXZbbWVkaW9dOwogICAgcmVwZWF0CiAgICAgIGlmIChvcmRpbmF0bykgdGhlbgogICAgICAgICBiZWdpbgogICAgICAgICAgICB3aGlsZSAodltpbmZdPHBpdm90KSBkbyAgaW5mOj1pbmYrMTsKICAgICAgICAgICAgd2hpbGUgKHZbc3VwXT5waXZvdCkgZG8gIHN1cDo9c3VwLTE7CiAgICAgICAgIGVuZDsKICAgICAgaWYgaW5mPD1zdXAgdGhlbgogICAgICAgYmVnaW4KICAgICAgICAgc2NhbWJpYSh2W2luZl0sdltzdXBdKTsKICAgICAgICAgaW5mOj1pbmYrMTsKICAgICAgICAgc3VwOj1zdXAtMTsKICAgICAgIGVuZDsKICAgIHVudGlsIGluZj5zdXA7CiAgICBpZiAoZXN0cmVtb2k8c3VwKSB0aGVuIG9yZGluYW1lbnRvKGVzdHJlbW9pLHN1cCx2LG9yZGluYXRvKTsKICAgIGlmIChpbmY8ZXN0cmVtb3MpIHRoZW4gb3JkaW5hbWVudG8oaW5mLGVzdHJlbW9zLHYsb3JkaW5hdG8pOwplbmQ7CgpiZWdpbgogICAgcmVhZChOKTsKCWZvciBpOj0xIHRvIE4gZG8KCSAgICAgICAgICAgICAgYmVnaW4KCSAgICAgICAgICAgICAgIHJlYWRsbiAoY29vcmRpbmF0ZVtpXVsxXSwgY29vcmRpbmF0ZVtpXVsyXSk7CgkgICAgICAgICAgICAgICBkaWZmY29vcmRbaV06PWNvb3JkaW5hdGVbaV1bMV0gLSBjb29yZGluYXRlW2ldWzJdOwoJICAgICAgICAgICAgICAgdWd1YWxpW2ldOj0xOwoJICAgICAgICAgICAgICBlbmQ7IAoJb3JkaW5hbWVudG8gKDEsTixkaWZmY29vcmQsIHRydWUpOwoJc3F1YXJlczo9MDsgaDo9MTsgaTo9MTsgCgl3aGlsZSBpPE4gZG8KCSAgICAgICAgIGJlZ2luCgkgICAgICAgICAgaWYgZGlmZmNvb3JkW2ldPWRpZmZjb29yZFtpKzFdIHRoZW4gYmVnaW4gdWd1YWxpW2hdOj11Z3VhbGlbaF0rMTsgaTo9aSsxOyBlbmQKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBiZWdpbiBpOj1pKzE7IGg6PWgrMTsgZW5kOwoJICAgICAgICAgZW5kOyAKCWZvciBpOj0xIHRvIGggZG8KCSAgICAgICAgICAgc3F1YXJlczo9c3F1YXJlcysodWd1YWxpW2ldKih1Z3VhbGlbaV0tMSkgZGl2IDIpOwogIHdyaXRlbG4oc3F1YXJlcyk7CmVuZC4KCg==