#include <stdio.h>
#include <stdlib.h>

struct entry
{
    int x, y1, y2, sgn;
} A[50000];
typedef struct entry entry;

int N, T[131072];
long long Res;

int cmp(const void *i,const void *j)
{
   entry *ei = (entry *) i, *ej = 
   (entry *) j;

    if (ei->x != ej->x)
       return ei->x - ej->x;
    return ej->sgn - ei->sgn;
}

int query(int n, int l, int r, int a, int b)
{
    int m, t = 0;
    
   if (a <= l && r <= b)
       return T[n];
   else
   {
    m = (l + r) / 2;
    if (a <= m) 
     t += query(2 * n, l, m, a, b);
    if (b > m) 
     t +=query(2*n+1,m+1,r, a, b);
    }
    return t;
}

void update(int n, int l, int r, int p, int v)
{
    int m = (l + r) / 2;

    T[n] += v;
    if (l == r) return;
    if (p <= m)
       update(2 * n, l, m, p, v);
    else
       update(2*n+1,m+1, r, p, v);
}

int main(void)
{
    FILE *f;
    int i, n, x1, y1, x2, y2;

    f = fopen("segment.in", "r");
    fscanf(f, "%d", &N);
    for (n = i = 0; i < N; i++)
    {
     fscanf(f, "%d %d %d %d", &x1, &y1, &x2, &y2);
      if (y1 == y2)
        A[n].x = x1, A[n].sgn = +1, 
        A[n++].y1 = y1,
        A[n].x = x2, A[n].sgn = -1, 
        A[n++].y1 = y1;
      else
        if (x1 == x2)
         A[n].x = x1, A[n].sgn = 0,
         A[n].y1=y1,A[n++].y2 = y2;
    }
    fclose(f);

    qsort(A, n, sizeof(entry), cmp);

    for (i = 0; i < n; i++)
    if (A[i].sgn == 0)
       Res += query(1, 0, 49999, A[i].y1, A[i].y2);
    else
       update(1, 0, 49999, A[i].y1, A[i].sgn);

    f = fopen("segment.out", "w");
    fprintf(f, "%lld\n", Res);
    fclose(f);

    return 0; }

