#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int node;
vector<int> g[N];
map<int, vector<int>> h, v;
map<int, vector<array<int, 3>>> mh;
int k = 0, ans = 0, cur = 0, tot = 0;
int sz[N];
const int mod = 2e9;
void init(int u, int p, int pd = 0) {
    cur += pd * sz[u];
    cur %= mod;
    for (int v : g[u]) {
        if (v == p) continue;
        init(v, u, pd + 1);
        sz[u] += sz[v];
    }
}
void dfs(int u, int p) {
    int sc = 0;
    for (int v : g[u]) if (v != p) sc += sz[v];
    ans += cur * (sz[u] - sc) % mod;
    ans %= mod;
    sort(g[u].begin(), g[u].end());
    g[u].erase(unique(g[u].begin(), g[u].end()), g[u].end());
    for (int v : g[u]) {
        if (v == p) continue;
        cur += (node - 2 * sz[v]);
        cur %= mod;
        dfs(v, u);
        cur -= (node - 2 * sz[v]);
        (cur += mod) %= mod;
    }
}
int32_t DistanceSum(int32_t n, int32_t *x, int32_t *y) {
    node = n;
    for (int i = 0; i < n; i++) {
        h[x[i]].push_back(y[i]);
        v[y[i]].push_back(x[i]);
    }
    for (int iter = 0; iter < 2; iter++) {
        for (auto& [key, vec] : h) {
            sort(vec.begin(), vec.end());
            for (int& x : vec) {
                if (!mh[key].empty() && mh[key].back()[1] + 1 == x) mh[key].back()[1]++, sz[mh[key].back()[2]]++;
                else mh[key].push_back({x, x, ++k}), sz[k]++;
            }
        }
        for (auto& [key, b] : mh) {
            if (!mh.count(key - 1)) continue;
            vector<array<int, 3>> a = mh[key - 1];
            for (auto& [x, y, id] : b) {
                int l = 0, r = a.size() - 1;
                while (l < r) {
                    int mid = (l + r + 1) / 2;
                    if (a[mid][1] < x) l = mid;
                    else r = mid - 1;
                }
                for (int i = l + !!(a[l][1] < x); i < a.size(); i++) {
                    auto [L, R, idx] = a[i];
                    if (R < x || y < L) break;
                    g[idx].push_back(id);
                    g[id].push_back(idx);
                }
            }
        }
        init(1, -1);
        dfs(1, -1);
        tot += ans;
        tot %= mod;
        k = ans = cur = 0;
        for (int i = 0; i < N; i++) sz[i] = 0, g[i].clear();
        h.swap(v);
        mh.clear();
    }
    return tot / 2;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |