Language: C++

#include <bits/stdc++.h>
 
using namespace std;
 
const int S = 500, SSS = S * S * S, N = 1e5 + 5, mod = 998244353;
 
long long powmod(long long b, long long p) {
  long long r = 1;
  for (; p; p >>= 1, b = b * b % mod)
    if (p & 1)
      r = r * b % mod;
  return r;
}
 
const int base = powmod(10, 18);
 
bitset<SSS> vis;
 
int pos(int a, int b, int c) {
  return ((a * S) + b) * S + c;
}
 
tuple<int, int, int> decod(int v) {
  int c = v % S;
  v /= S;
  int b = v % S;
  v /= S;
  return make_tuple(v, b, c);
}
 
vector<int> g[N];
 
vector<pair<int, int>> independent(int n, vector<pair<int ,int>> & edges) {
  for (int i = 0; i < n; ++i)
    g[i].clear();
  for (auto e : edges) {
    g[e.first].push_back(e.second);
    g[e.second].push_back(e.first);
  }
  vector<bool> done(n, false), mark(n);
  int cnt = 0;
  vector<pair<int, int>> res;
  while (cnt < n) {
    mark = done;
    int hig = -1, sum = 0;
    for (int v = n-1; v >= 0; --v) {
      if (mark[v]) continue;
      ++cnt;
      done[v] = 1;
      hig = max(hig, v+1);
      sum = (sum + powmod(base, v+1)) % mod;
      for (int u : g[v]) {
        mark[u] = 1;
      }
    }
    res.emplace_back(hig, sum);
  }
  return res;
}
 
vector<pair<int, int>> read_edges() {
  int m;
  scanf("%d", &m);
  vector<pair<int, int>> edges(m);
  for (int i = 0; i < m; ++i) {
    scanf("%d %d", &edges[i].first, &edges[i].second);
    --edges[i].first;
    --edges[i].second;
  }
  return edges;
}
 
int main() {
  auto start_t = clock();
  int n;
  scanf("%d", &n);
  vector<pair<int, int>> ex = read_edges();
  vector<pair<int, int>> ey = read_edges();
  vector<pair<int, int>> ez = read_edges();
  vector<pair<int, int>> rx = independent(n, ex);
  vector<pair<int, int>> ry = independent(n, ey);
  vector<pair<int, int>> rz = independent(n, ez);
  assert(rx.size() < S);
  assert(ry.size() < S);
  assert(rz.size() < S);
  vector<vector<bool>> xy(rx.size(), vector<bool>(ry.size(), false));
  vector<vector<bool>> xz(rx.size(), vector<bool>(rz.size(), false));
  vector<vector<bool>> yz(ry.size(), vector<bool>(rz.size(), false));
  priority_queue<pair<int, int>> pq;
  auto insert_node = [&](int i, int j, int k) {
    if (i >= (int)rx.size() || j >= (int)ry.size() || k >= (int)rz.size())
      return;
    int now = pos(i, j, k);
    if (vis[now])
      return;
    pq.emplace(rx[i].first + ry[j].first + rz[k].first, now);
    vis[now] = 1;
  };
  insert_node(0, 0, 0);
  long long ans = 0;
  while (!pq.empty() && (double)(clock() - start_t) / CLOCKS_PER_SE < 1.8) {
    auto it = pq.top();
    pq.pop();
    int i, j, k;
    tie(i, j, k) = decod(it.second);
    insert_node(i+1, j, k);
    insert_node(i, j+1, k);
    insert_node(i, j, k+1);
    if (xy[i][j] || xz[i][k] || yz[j][k]) continue;
    long long cur = rx[i].second * (long long) ry[j].second % mod;
    cur = cur * rz[k].second % mod;
    ans = (ans + cur) % mod;
    xy[i][j] = 1;
    xz[i][k] = 1;
    yz[j][k] = 1;
  }
  printf("%lld\n", ans);
  return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:101:55: error: 'CLOCKS_PER_SE' was not declared in this scope; did you mean 'CLOCKS_PER_SEC'?
  101 |   while (!pq.empty() && (double)(clock() - start_t) / CLOCKS_PER_SE < 1.8) {
      |                                                       ^~~~~~~~~~~~~
      |                                                       CLOCKS_PER_SEC