#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
void pr(const pair<T1, T2>& x);
template <class T, size_t SZ>
void pr(const array<T, SZ>& x);
template <class T>
void pr(const vector<T>& x);
template <class T>
void pr(const set<T>& x);
template <class T1, class T2>
void pr(const map<T1, T2>& x);
template <class T>
void pr(const T& x) {
  cout << x;
}
template <class Arg, class... Args>
void pr(const Arg& first, const Args&... rest) {
  pr(first);
  pr(rest...);
}
template <class T1, class T2>
void pr(const pair<T1, T2>& x) {
  pr("{", x.first, ", ", x.second, "}");
}
template <class T>
void prContain(const T& x) {
  pr("{");
  bool fst = 1;
  for (auto& a : x) pr(!fst ? ", " : "", a), fst = 0;
  pr("}");
}
template <class T, size_t SZ>
void pr(const array<T, SZ>& x) {
  prContain(x);
}
template <class T>
void pr(const vector<T>& x) {
  prContain(x);
}
template <class T>
void pr(const set<T>& x) {
  prContain(x);
}
template <class T1, class T2>
void pr(const map<T1, T2>& x) {
  prContain(x);
}
void ps() { pr("\n"); }
template <class Arg, class... Args>
void ps(const Arg& first, const Args&... rest) {
  pr(first, " ");
  ps(rest...);
}
template <typename T>
int remin(T& a, const T& b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
int remax(T& a, const T& b) {
  if (b > a) {
    a = b;
    return true;
  }
  return false;
}
const int NN = 10005;
int N;
int x1, x2, _y1, _y2;
vector<pair<int, int> > h[NN], v[NN];
struct Fenwick_Tree {
  int bit[NN + 5];
  inline int low_bit(int idx) { return idx & (-idx); }
  int sum(int idx) {
    int total = 0;
    int k = idx + 1;
    while (k > 0) {
      total += bit[k];
      k -= low_bit(k);
    }
    return total;
  }
  void update(int idx, int v) {
    int k = idx + 1;
    while (k < NN + 5) {
      bit[k] += v;
      k += low_bit(k);
    }
  }
  int query(int l, int r) { return sum(r) - sum(l - 1); }
} ft;
int main(int argc, const char** argv) {
  scanf("%d", &N);
  for (int i = 0; i < N; ++i) {
    scanf("%d%d%d%d", &x1, &_y1, &x2, &_y2);
    x1 += 5000;
    x2 += 5000;
    _y1 += 5000;
    _y2 += 5000;
    if (x1 == x2) {
      v[x1].push_back(pair<int, int>(min(_y1, _y2), max(_y1, _y2)));
    } else {
      h[_y1].push_back(pair<int, int>(min(x1, x2), max(x1, x2)));
    }
  }
  long long ans = 0;
  for (int y = 0; y < NN; ++y)
    for (auto [l, r] : h[y]) {
      vector<int> cross[NN];
      int mxy = 0;
      for (int x = l; x <= r; ++x) {
        for (auto [lo, up] : v[x]) {
          if (lo <= y && up > y) {
            cross[up].push_back(x);
            ft.update(x, 1);
            remax(mxy, up);
          }
        }
      }
      for (int _y1 = y + 1; _y1 <= mxy; ++_y1) {
        for (auto [x3, x4] : h[_y1]) {
          int n = ft.query(x3, x4);
          ans += n * (n - 1) / 2;
        }
        for (auto e : cross[_y1]) ft.update(e, -1);
      }
    }
  ps(ans);
  return 0;
}
