Language: C++

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// #define int ll

typedef vector<int> vi;
typedef vector<bool> vb;
typedef pair<int,int> pii;
typedef vector<pair<int,int> > vpii;
typedef vector<vector<bool> > vvb;
typedef vector<vector<int> > vvi;
typedef map<int, bool> mib;

typedef long long ll;
typedef vector<long long> vl;
typedef pair<long long,long long> pll;
typedef vector<pair<long long,long long> > vpll;

typedef vector<string> vs;

typedef long double ld;

#define REP(i,n) for (int i = 0; i < (n); ++i)
#define REPD(i,n) for (int i = (n-1); i >= 0; --i)
#define FORE(i, s, n) for (int i = (s); i <= (int)(n); i++)
#define FORED(i, s, n) for (int i = (s); i >= (int)(n); i--)
#define debug(x) cerr << #x << ": " << x << '\n'
#define debug2(x, y) cerr << #x << ": " << x << ", " << #y << ": " << y << '\n'
#define debug3(x, y, z) cerr << #x << ": " << x << ", " << #y << ": " << y << ", " << #z << ": " << z << '\n'
#define debugs(s) cerr << s << "\n"
#define hyphen() cerr << "--\n"

#define ALL(vec) (vec).begin(), (vec).end()
#define REVALL(vec) (vec).rbegin(), (vec).rend()

static const int dy[4] = {0,1,0,-1}, dx[4] = {1,0,-1,0};

#define fst first
#define snd second
#define pb push_back
#define mk(x,y) make_pair((x),(y))

// http://ehafib.hatenablog.com/entry/2015/12/23/164137
int qp(int a,ll b){int ans=1;do{if(b&1)ans=1ll*ans*a;a=1ll*a*a;}while(b>>=1);return ans;}
int qpm(int a,ll b,int mo){int ans=1;do{if(b&1)ans=1ll*ans*a%mo;a=1ll*a*a%mo;}while(b>>=1);return ans;}
// gcd : O(logN)
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a, int b) { return a / gcd(a, b) * b; }

#define sz(v) int(v.size())

// x1, x2ライブラリとの被りを避ける
#define x1 x192837465
#define x2 x123456789
#define y1 y192837465
#define y2 y123456789

// typo
#define itn int
#define reutrn return
#define reutnr return
#define srting string
#define cosnt const

#define make(type, x) type x; cin>>x;
#define make2(type, x, y) type x, y; cin>>x>>y;
#define make3(type, x, y, z) type x, y, z; cin>>x>>y>>z;
#define make4(type, x, y, z, t) type x, y, z, t; cin>>x>>y>>z>>t;

int ctoi(const char c){
    if('0' <= c && c <= '9') return (c-'0');
    return -1;
}

#define uniq(v) (v).erase(unique(ALL((v))), (v).end());

// area of (0, 0)(a, b)(c, d)
double area(double a, double b, double c, double d){
    return abs(a * d - b * c) / 2.0;
}

const int PREC = 10;
#define coutf(val) cout << fixed << setprecision(PREC) << (val) << endl;

const int MOD = (int)1e9 + 7;
const int INF = numeric_limits<int>::max();

std::string replaceOtherStr(std::string &replacedStr, std::string from, std::string to) {
    const int pos = replacedStr.find(from);
    const int len = from.length();

    if (pos == std::string::npos || from.empty()) {
        return replacedStr;
    }

    return replacedStr.replace(pos, len, to);
}

// Asの中で、aより真に大きい要素の中で最小のindexを取得
// Asは昇順でソート済み
// 存在しない場合は-1を返す
int search_gt_ind(const vi As, int N, int a) {
  if (As.at(N-1) <= a) {
    return -1;
  }

  if (a < As.at(0)) {
    return 0;
  }


  int ok_ind = N-1;
  int ng_ind = 0;

   while(ok_ind - ng_ind > 1 && As.(ng_ind-1) != As.at(ok_ind)) {
    int mid = (ok_ind + ng_ind) / 2;
//     debug(ok_ind);
//     debug(ng_ind);
//     debug(mid);

    if (As.at(mid) == a) {
      ng_ind = mid;
    } else if (As.at(mid) < a) {
      ng_ind = mid;
    } else {
      ok_ind = mid;
    }

  }
    
    return ok_ind;
}

// Asの中で、aより真に小さい要素の中で最大のindexを取得
// Asは昇順でソート済み
// 存在しない場合は-1を返す
int search_lt_ind(const vi As, int N, int a) {
  if (As.at(N-1) < a) {
    return N-1;
  }

  if (a <= As.at(0)) {
    return -1;
  }

  int ok_ind = 0;
  int ng_ind = N-1;

  while(ng_ind - ok_ind > 1 || As.(ng_ind-1) != As.at(ok_ind) ) {
    int mid = (ok_ind + ng_ind) / 2;
//     debug(ok_ind);
//     debug(ng_ind);
//     debug(mid);

    if (As.at(mid) == a) {
      ng_ind = mid;
    } else if (As.at(mid) < a) {
      ok_ind = mid;
    } else {
      ng_ind = mid;
    }

  }
    
    return ok_ind;
}


signed main() {
  make(int, N);

  vi As(N);
  vi Bs(N);
  vi Cs(N);
  REP(n, N) {
    make(int, A);
    As.at(n) = A;
  }

  REP(n, N) {
    make(int, B);
    Bs.at(n) = B;
  }

  REP(n, N) {
    make(int, C);
    Cs.at(n) = C;
  }

  sort(ALL(As));
  sort(ALL(Bs));
  sort(ALL(Cs));


  int ans = 0;
  for(auto b : Bs) {
    // Asの中でbより小さいのはいくつ?
    int lt_ind = search_lt_ind(As, N, b);

    // Csの中でbより大きいのはいくつ?
    int gt_ind = search_gt_ind(Cs, N, b);

    if (lt_ind == -1 || gt_ind == -1) {
      continue;
    }

    int cnt = (lt_ind + 1) * (N - gt_ind);

//     debug(b);
//     debug2(lt_ind, As.at(lt_ind));
//     debug2(gt_ind, Cs.at(gt_ind));
//     debug(cnt);


    ans += cnt;

  }

  cout << ans << endl;


}


Compiler output:
a.cc: In function 'int search_gt_ind(vi, int, int)':
a.cc:115:36: error: expected unqualified-id before '(' token
  115 |    while(ok_ind - ng_ind > 1 && As.(ng_ind-1) != As.at(ok_ind)) {
      |                                    ^
a.cc: In function 'int search_lt_ind(vi, int, int)':
a.cc:149:35: error: expected unqualified-id before '(' token
  149 |   while(ng_ind - ok_ind > 1 || As.(ng_ind-1) != As.at(ok_ind) ) {
      |                                   ^