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==