#include <bits/stdc++.h>
using std::cerr;
using std::endl;
const int N = 2e6, P = 998244353, I2 = (P + 1) / 2;
int na, nb;
struct SegTree {
  static const long long lim = (1ll << 60) - 1;
  int ch[N][2], tot, root;
  bool tag[N];
  void modify(int &p, long long l, long long r, long long L, long long R) {
    if (!p) p = ++tot;
    if (l <= L && r >= R) {
      tag[p] = 1;
      return;
    }
    long long mid = (L + R) >> 1;
    if (l <= mid) modify(ch[p][0], l, r, L, mid);
    if (r > mid) modify(ch[p][1], l, r, mid + 1, R);
  }
  inline void modify(long long l, long long r) { modify(root, l, r, 0, lim); }
} A, B;
std::vector<std::pair<int, int>> vec[233];
long long dfs(int dep, long long val) {
  for (auto p : vec[dep])
    if (A.tag[p.first] || B.tag[p.second])
      return ((1ll << dep) % P * (((1ll << dep) - 1) % P * I2 % P + val % P)) %
             P;
  long long ret = 0;
  for (int i = 0; i < 2; ++i) {
    vec[dep - 1].clear();
    for (auto p : vec[dep])
      for (int j = 0; j < 2; ++j) {
        int x = A.ch[p.first][j], y = B.ch[p.second][j ^ i];
        if (x && y) vec[dep - 1].push_back({x, y});
      }
    if (!vec[dep - 1].empty())
      ret = (ret + dfs(dep - 1, val | ((long long)i << (dep - 1)))) % P;
  }
  return ret;
}
int main() {
  std::cin >> na;
  for (int i = 1; i <= na; ++i) {
    long long l, r;
    std::cin >> l >> r;
    A.modify(l, r);
  }
  std::cin >> nb;
  for (int i = 1; i <= nb; ++i) {
    long long l, r;
    std::cin >> l >> r;
    B.modify(l, r);
  }
  vec[60].push_back({A.root, B.root});
  std::cout << dfs(60, 0) << std::endl;
  return 0;
}
