description: Two painters, Amin and Benj, are repainting Gregor's living room ceiling! The ceiling can be modeled as an n × m grid.
  
  For each i between 1 and n, inclusive, painter Amin applies a_i layers of paint to the entire i-th row. For each j between 1 and m, inclusive, painter Benj applies b_j layers of paint to the entire j-th column. Therefore, the cell (i,j) ends up with a_i+b_j layers of paint.
  
  Gregor considers the cell (i,j) to be badly painted if a_i+b_j ≤ x. Define a badly painted region to be a maximal connected component of badly painted cells, i. e. a connected component of badly painted cells such that all adjacent to the component cells are not badly painted. Two cells are considered adjacent if they share a side.
  
  Gregor is appalled by the state of the finished ceiling, and wants to know the number of badly painted regions.
  
  Input
  
  The first line contains three integers n, m and x (1 ≤ n,m ≤ 2⋅ 10^5, 1 ≤ x ≤ 2⋅ 10^5) — the dimensions of Gregor's ceiling, and the maximum number of paint layers in a badly painted cell.
  
  The second line contains n integers a_1, a_2, …, a_n (1 ≤ a_i ≤ 2⋅ 10^5), the number of paint layers Amin applies to each row.
  
  The third line contains m integers b_1, b_2, …, b_m (1 ≤ b_j ≤ 2⋅ 10^5), the number of paint layers Benj applies to each column.
  
  Output
  
  Print a single integer, the number of badly painted regions.
  
  Examples
  
  Input
  
  
  3 4 11
  9 8 5
  10 6 7 2
  
  
  Output
  
  
  2
  
  
  Input
  
  
  3 4 12
  9 8 5
  10 6 7 2
  
  
  Output
  
  
  1
  
  
  Input
  
  
  3 3 2
  1 2 1
  1 2 1
  
  
  Output
  
  
  4
  
  
  Input
  
  
  5 23 6
  1 4 3 5 2
  2 3 1 6 1 5 5 6 1 3 2 6 2 3 1 6 1 4 1 6 1 5 5
  
  
  Output
  
  
  6
  
  Note
  
  The diagram below represents the first example. The numbers to the left of each row represent the list a, and the numbers above each column represent the list b. The numbers inside each cell represent the number of paint layers in that cell.
  
  The colored cells correspond to badly painted cells. The red and blue cells respectively form 2 badly painted regions.
  
  <image>
solution: #include <bits/stdc++.h>
  using namespace std;
  const int N = 2e5 + 10;
  int n, m, x, a[N], b[N], c[N], d[N];
  int stk[N], top, st[20][N], lg[N];
  inline int getmx(int l, int r) {
    if (l > r) return 0x3f3f3f3f;
    int len = lg[r - l + 1];
    return max(st[len][l], st[len][r - (1 << len) + 1]);
  }
  inline void init(int n, int *a, int *c) {
    for (int i = 2; i <= n; ++i) lg[i] = lg[i >> 1] + 1;
    for (int i = 1; i <= n; ++i) st[0][i] = a[i];
    for (int j = 1; (1 << j) <= n; ++j)
      for (int i = 1; i + (1 << j) - 1 <= n; ++i)
        st[j][i] = max(st[j - 1][i], st[j - 1][i + (1 << j - 1)]);
    top = 0;
    for (int i = 1; i <= n; ++i) {
      while (top && a[stk[top]] >= a[i]) --top;
      c[i] = 0x3f3f3f3f;
      if (top) c[i] = getmx(stk[top] + 1, i);
      stk[++top] = i;
    }
    top = 0;
    for (int i = n; i >= 1; --i) {
      while (top && a[stk[top]] > a[i]) --top;
      if (top) c[i] = min(c[i], getmx(i, stk[top] - 1));
      stk[++top] = i;
    }
  }
  struct node {
    int x, y, tp;
  } p[N << 1];
  inline bool cmp(const node &a, const node &b) { return a.y - a.x > b.y - b.x; }
  struct BIT {
    int c[N];
    inline int lowbit(int x) { return x & (-x); }
    inline void add(int a, int v) {
      for (; a <= x; a += lowbit(a)) c[a] += v;
    }
    inline int query(int l, int r) {
      if (l > r) return 0;
      int ret = 0;
      for (int i = r; i > 0; i -= lowbit(i)) ret += c[i];
      for (int i = l - 1; i > 0; i -= lowbit(i)) ret -= c[i];
      return ret;
    }
  } A, B;
  int main() {
    scanf("%d%d%d", &n, &m, &x);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    for (int i = 1; i <= m; ++i) scanf("%d", &b[i]);
    init(n, a, c);
    init(m, b, d);
    int tot = 0;
    for (int i = 1; i <= n; ++i) p[++tot] = (node){a[i], c[i], 0};
    for (int i = 1; i <= m; ++i) p[++tot] = (node){b[i], d[i], 1};
    sort(p + 1, p + tot + 1, cmp);
    long long ans = 0;
    for (int i = 1; i <= tot; ++i) {
      int a = p[i].x, c = p[i].y;
      if (p[i].tp == 0)
        ans += B.query(x - c + 1, x - a), A.add(a, 1);
      else
        ans += A.query(x - c + 1, x - a), B.add(a, 1);
    }
    printf("%lld\n", ans);
    return 0;
  }
  