#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<vector>
#include<algorithm>
struct SCD
{
int sum;
int ways;
};
SCD scd[17000000]; // stores sum of array C and D, and number of ways to obtain the sum
int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}
bool compare(const SCD &a, const SCD &b)
{
return(a.sum<b.sum);
}
int readint() //fast I/O utility function
{
char cc = getc(stdin);
int multiplier=1;
if(cc=='-'){
multiplier=-1;
cc=getc(stdin);
}
for (;cc < '0' || cc > '9';) cc = getc(stdin);
int ret = 0;
for (;cc >= '0' && cc <= '9';)
{
ret = ret * 10 + cc - '0';
cc = getc(stdin);
}
return ret*multiplier;
}
using namespace std;
int sab[17000000]={0}; // stores sum of array A and B
int o_sab[17000000]={0}; // stores the ways to obtain the sum of array A and B
int f_scd[17000000]={0}; // stores the final array of sum of integers in C and D array, without repeatition
int o_scd[17000000]={0}; // stores the ways to obtain the sum of array A and B
int main()
{
int A[4010];
int B[4010];
int C[4010];
int D[4010];
int r_a[4010]={0}; // stores repeatition/frequency of array elements in array A
int r_b[4010]={0};
int r_c[4010]={0};
int r_d[4010]={0};
int i,j,k,l,m,n,a,b,c,d;
n=readint();
for(i=0;i<n;i++)
{
a=readint();
b=readint();
c=readint();
d=readint();
A[i]=a, B[i]=b, C[i]=c, D[i]=d;
}
qsort(A,n,sizeof(int),cmp);
qsort(B,n,sizeof(int),cmp);
qsort(C,n,sizeof(int),cmp);
qsort(D,n,sizeof(int),cmp);
int f_A[4010]={0},f_B[4010]={0}, f_C[4010]={0}, f_D[4010]={0};
int i_a=0, i_b=0, i_c=0, i_d=0;
f_A[i_a]=A[0];
r_a[i_a]++;
i_a++;
for(i=1;i<n;i++) // obtaining the final array f_A from array A without repeatition of elements
{
if(f_A[i_a-1]==A[i])
{
r_a[i_a-1]++;
}
else
{
f_A[i_a]=A[i];
r_a[i_a]++;
i_a++;
}
}
f_B[i_b]=B[0];
r_b[i_b]++;
i_b++;
for(i=1;i<n;i++)
{
if(f_B[i_b-1]==B[i])
{
r_b[i_b-1]++;
}
else
{
f_B[i_b]=B[i];
r_b[i_b]++;
i_b++;
}
}
f_C[i_c]=C[0];
r_c[i_c]++;
i_c++;
for(i=1;i<n;i++)
{
if(f_C[i_c-1]==C[i])
{
r_c[i_c-1]++;
}
else
{
f_C[i_c]=C[i];
r_c[i_c]++;
i_c++;
}
}
f_D[i_d]=D[0];
r_d[i_d]++;
i_d++;
for(i=1;i<n;i++)
{
if(f_D[i_d-1]==D[i])
{
r_d[i_d-1]++;
}
else
{
f_D[i_d]=D[i];
r_d[i_d]++;
i_d++;
}
}
int i_sab=0;
for(i=0;i<i_a;i++)
{
for(j=0;j<i_b;j++)
{
sab[i_sab]=f_A[i]+f_B[j];
o_sab[i_sab]=r_a[i]*r_b[j];
i_sab++;
}
}
int i_scd=0;
for(i=0;i<i_c;i++) // store the number of ways to obtain sum of integers in list C and D and sum of array elements
{
for(j=0;j<i_d;j++)
{
scd[i_scd].sum=f_C[i]+f_D[j];
scd[i_scd].ways=r_c[i]*r_d[j];
i_scd++;
}
}
sort(&scd[0], &scd[i_scd], compare);
int fi_scd=0;
f_scd[fi_scd]=scd[0].sum; // stores first sum of C and D for matching with other sums
o_scd[fi_scd]+=scd[0].ways; // stores number of ways to generate the sum
fi_scd++;
for(i=1;i<i_scd;i++)
{
if(f_scd[fi_scd-1]==scd[i].sum)
{
o_scd[fi_scd-1]+=scd[i].ways; // sotres number of ways to obtain a sum
}
else
{
f_scd[fi_scd]=scd[i].sum; // stores new sum without repeatition
o_scd[fi_scd]+=scd[i].ways;
fi_scd++;
}
}
int ans=0;
for(i=0;i<i_sab;i++)
{
int low=0, high,mid;
high=fi_scd-1;
mid=(low+high)/2;
while(low<=high) // binary search
{
mid=(low+high)/2;
if(sab[i]+f_scd[mid]==0)
{
ans+=o_sab[i]*o_scd[mid];
break;
}
else if(sab[i]+f_scd[mid]>0)
high=mid-1;
else if(sab[i]+f_scd[mid]<0)
low=mid+1;
}
}
printf("%d\n",ans); // print ans , yet SIGKILL :(
return(0);
}
I2luY2x1ZGU8Y3N0ZGxpYj4KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNzdGRpbz4KI2luY2x1ZGU8Y3N0ZGxpYj4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPGFsZ29yaXRobT4Kc3RydWN0IFNDRAp7CiAgICBpbnQgc3VtOwogICAgaW50IHdheXM7Cn07ClNDRCBzY2RbMTcwMDAwMDBdOyAgLy8gc3RvcmVzIHN1bSBvZiBhcnJheSBDIGFuZCBELCBhbmQgbnVtYmVyIG9mIHdheXMgdG8gb2J0YWluIHRoZSBzdW0KaW50IGNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQp7CiAgICByZXR1cm4oKihpbnQgKilhLSooaW50ICopYik7Cn0KCmJvb2wgY29tcGFyZShjb25zdCBTQ0QgJmEsIGNvbnN0IFNDRCAmYikKewogICAgcmV0dXJuKGEuc3VtPGIuc3VtKTsKfQppbnQgcmVhZGludCgpIC8vZmFzdCBJL08gdXRpbGl0eSBmdW5jdGlvbgogICAgewogICAgICAgY2hhciBjYyA9IGdldGMoc3RkaW4pOwogICAgICAgaW50IG11bHRpcGxpZXI9MTsKICAgICAgIGlmKGNjPT0nLScpewogICAgICAgIG11bHRpcGxpZXI9LTE7CiAgICAgICAgY2M9Z2V0YyhzdGRpbik7CiAgICAgICB9CiAgICAgICBmb3IgKDtjYyA8ICcwJyB8fCBjYyA+ICc5JzspICBjYyA9IGdldGMoc3RkaW4pOwogICAgICAgaW50IHJldCA9IDA7CiAgICAgICBmb3IgKDtjYyA+PSAnMCcgJiYgY2MgPD0gJzknOykKICAgICAgIHsKICAgICAgICAgIHJldCA9IHJldCAqIDEwICsgY2MgLSAnMCc7CiAgICAgICAgICBjYyA9IGdldGMoc3RkaW4pOwogICAgICAgfQogICAgICByZXR1cm4gcmV0Km11bHRpcGxpZXI7Cn0KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IHNhYlsxNzAwMDAwMF09ezB9OyAvLyBzdG9yZXMgc3VtIG9mIGFycmF5IEEgYW5kIEIKICAgaW50IG9fc2FiWzE3MDAwMDAwXT17MH07IC8vIHN0b3JlcyB0aGUgd2F5cyB0byBvYnRhaW4gdGhlIHN1bSBvZiBhcnJheSBBIGFuZCBCCmludCBmX3NjZFsxNzAwMDAwMF09ezB9OyAvLyBzdG9yZXMgdGhlIGZpbmFsIGFycmF5IG9mIHN1bSBvZiBpbnRlZ2VycyBpbiBDIGFuZCBEIGFycmF5LCB3aXRob3V0IHJlcGVhdGl0aW9uCmludCBvX3NjZFsxNzAwMDAwMF09ezB9OyAvLyBzdG9yZXMgdGhlIHdheXMgdG8gb2J0YWluIHRoZSBzdW0gb2YgYXJyYXkgQSBhbmQgQgppbnQgbWFpbigpCnsKICAgaW50IEFbNDAxMF07CiAgIGludCBCWzQwMTBdOwogICBpbnQgQ1s0MDEwXTsKICAgaW50IERbNDAxMF07CiAgICBpbnQgcl9hWzQwMTBdPXswfTsgIC8vIHN0b3JlcyByZXBlYXRpdGlvbi9mcmVxdWVuY3kgIG9mIGFycmF5IGVsZW1lbnRzIGluIGFycmF5IEEKICAgIGludCByX2JbNDAxMF09ezB9OwogICAgaW50IHJfY1s0MDEwXT17MH07CiAgICBpbnQgcl9kWzQwMTBdPXswfTsKICAgIGludCBpLGosayxsLG0sbixhLGIsYyxkOwogICAgbj1yZWFkaW50KCk7CiAgICBmb3IoaT0wO2k8bjtpKyspCiAgICB7CiAgICAgICAgYT1yZWFkaW50KCk7CiAgICAgICAgYj1yZWFkaW50KCk7CiAgICAgICAgYz1yZWFkaW50KCk7CiAgICAgICAgZD1yZWFkaW50KCk7CiAgICAgICBBW2ldPWEsIEJbaV09YiwgQ1tpXT1jLCBEW2ldPWQ7CiAgICB9CiAgICBxc29ydChBLG4sc2l6ZW9mKGludCksY21wKTsKICAgIHFzb3J0KEIsbixzaXplb2YoaW50KSxjbXApOwogICAgcXNvcnQoQyxuLHNpemVvZihpbnQpLGNtcCk7CiAgICBxc29ydChELG4sc2l6ZW9mKGludCksY21wKTsKICAgIGludCBmX0FbNDAxMF09ezB9LGZfQls0MDEwXT17MH0sIGZfQ1s0MDEwXT17MH0sIGZfRFs0MDEwXT17MH07CgogICAgaW50IGlfYT0wLCBpX2I9MCwgaV9jPTAsIGlfZD0wOwogICAgZl9BW2lfYV09QVswXTsKICAgIHJfYVtpX2FdKys7CiAgICBpX2ErKzsKCiAgICBmb3IoaT0xO2k8bjtpKyspIC8vIG9idGFpbmluZyB0aGUgZmluYWwgYXJyYXkgZl9BIGZyb20gYXJyYXkgQSB3aXRob3V0IHJlcGVhdGl0aW9uIG9mIGVsZW1lbnRzCiAgICB7CiAgICAgICAgaWYoZl9BW2lfYS0xXT09QVtpXSkKICAgICAgICB7CiAgICAgICAgICAgIHJfYVtpX2EtMV0rKzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZl9BW2lfYV09QVtpXTsKICAgICAgICAgICAgcl9hW2lfYV0rKzsKICAgICAgICAgICAgaV9hKys7CiAgICAgICAgfQogICAgfQoKICAgIGZfQltpX2JdPUJbMF07CiAgICByX2JbaV9iXSsrOwogICAgaV9iKys7CgogICAgICAgIGZvcihpPTE7aTxuO2krKykKICAgIHsKICAgICAgICBpZihmX0JbaV9iLTFdPT1CW2ldKQogICAgICAgIHsKICAgICAgICAgICAgcl9iW2lfYi0xXSsrOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmX0JbaV9iXT1CW2ldOwogICAgICAgICAgICByX2JbaV9iXSsrOwogICAgICAgICAgICBpX2IrKzsKICAgICAgICB9CiAgICB9CgogICAgICBmX0NbaV9jXT1DWzBdOwogICAgcl9jW2lfY10rKzsKICAgIGlfYysrOwoKICAgICAgICBmb3IoaT0xO2k8bjtpKyspCiAgICB7CiAgICAgICAgaWYoZl9DW2lfYy0xXT09Q1tpXSkKICAgICAgICB7CiAgICAgICAgICAgIHJfY1tpX2MtMV0rKzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZl9DW2lfY109Q1tpXTsKICAgICAgICAgICAgcl9jW2lfY10rKzsKICAgICAgICAgICAgaV9jKys7CiAgICAgICAgfQogICAgfQoKICAgICAgZl9EW2lfZF09RFswXTsKICAgIHJfZFtpX2RdKys7CiAgICBpX2QrKzsKCiAgICAgICAgZm9yKGk9MTtpPG47aSsrKQogICAgewogICAgICAgIGlmKGZfRFtpX2QtMV09PURbaV0pCiAgICAgICAgewogICAgICAgICAgICByX2RbaV9kLTFdKys7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZfRFtpX2RdPURbaV07CiAgICAgICAgICAgIHJfZFtpX2RdKys7CiAgICAgICAgICAgIGlfZCsrOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgaV9zYWI9MDsKICAgIGZvcihpPTA7aTxpX2E7aSsrKQogICAgewogICAgICAgIGZvcihqPTA7ajxpX2I7aisrKQogICAgICAgIHsKICAgICAgICAgICAgc2FiW2lfc2FiXT1mX0FbaV0rZl9CW2pdOwogICAgICAgICAgICBvX3NhYltpX3NhYl09cl9hW2ldKnJfYltqXTsKICAgICAgICAgICAgaV9zYWIrKzsKICAgICAgICB9CiAgICB9CgoKICAgIGludCBpX3NjZD0wOwogICAgZm9yKGk9MDtpPGlfYztpKyspIC8vIHN0b3JlIHRoZSBudW1iZXIgb2Ygd2F5cyB0byBvYnRhaW4gc3VtIG9mIGludGVnZXJzIGluIGxpc3QgQyBhbmQgRCBhbmQgc3VtIG9mIGFycmF5IGVsZW1lbnRzCiAgICB7CiAgICAgICAgZm9yKGo9MDtqPGlfZDtqKyspCiAgICAgICAgewogICAgICAgICAgICBzY2RbaV9zY2RdLnN1bT1mX0NbaV0rZl9EW2pdOwogICAgICAgICAgIHNjZFtpX3NjZF0ud2F5cz1yX2NbaV0qcl9kW2pdOwogICAgICAgICAgICBpX3NjZCsrOwogICAgICAgIH0KICAgIH0KCiAgICBzb3J0KCZzY2RbMF0sICZzY2RbaV9zY2RdLCBjb21wYXJlKTsKCiAgICBpbnQgZmlfc2NkPTA7CiAgICBmX3NjZFtmaV9zY2RdPXNjZFswXS5zdW07IC8vIHN0b3JlcyBmaXJzdCBzdW0gb2YgQyBhbmQgRCBmb3IgbWF0Y2hpbmcgd2l0aCBvdGhlciBzdW1zCiAgICBvX3NjZFtmaV9zY2RdKz1zY2RbMF0ud2F5czsgLy8gc3RvcmVzIG51bWJlciBvZiB3YXlzIHRvIGdlbmVyYXRlIHRoZSBzdW0KICAgIGZpX3NjZCsrOwoKICAgIGZvcihpPTE7aTxpX3NjZDtpKyspCiAgICB7CiAgICAgICAgaWYoZl9zY2RbZmlfc2NkLTFdPT1zY2RbaV0uc3VtKQogICAgICAgIHsKICAgICAgICAgICAgb19zY2RbZmlfc2NkLTFdKz1zY2RbaV0ud2F5czsgIC8vIHNvdHJlcyBudW1iZXIgb2Ygd2F5cyB0byBvYnRhaW4gYSBzdW0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZl9zY2RbZmlfc2NkXT1zY2RbaV0uc3VtOyAvLyBzdG9yZXMgbmV3IHN1bSB3aXRob3V0IHJlcGVhdGl0aW9uCiAgICAgICAgICAgIG9fc2NkW2ZpX3NjZF0rPXNjZFtpXS53YXlzOwogICAgICAgICAgICBmaV9zY2QrKzsKICAgICAgICB9CiAgICB9CgoKICAgIGludCBhbnM9MDsKICAgIGZvcihpPTA7aTxpX3NhYjtpKyspCiAgICB7CiAgICAgICAgaW50IGxvdz0wLCBoaWdoLG1pZDsKICAgICAgICBoaWdoPWZpX3NjZC0xOwogICAgICAgIG1pZD0obG93K2hpZ2gpLzI7CiAgICAgICAgd2hpbGUobG93PD1oaWdoKSAvLyBiaW5hcnkgc2VhcmNoCiAgICAgICAgewogICAgICAgICAgICBtaWQ9KGxvdytoaWdoKS8yOwogICAgICAgICAgICBpZihzYWJbaV0rZl9zY2RbbWlkXT09MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5zKz1vX3NhYltpXSpvX3NjZFttaWRdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihzYWJbaV0rZl9zY2RbbWlkXT4wKQogICAgICAgICAgICAgICAgaGlnaD1taWQtMTsKICAgICAgICAgICAgZWxzZSBpZihzYWJbaV0rZl9zY2RbbWlkXTwwKQogICAgICAgICAgICAgICAgbG93PW1pZCsxOwogICAgICAgIH0KICAgIH0KICAgIHByaW50ZigiJWRcbiIsYW5zKTsgLy8gcHJpbnQgYW5zICwgeWV0IFNJR0tJTEwgOigKICAgIHJldHVybigwKTsKfQo=