1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 3e5 + 50; int tot, head[maxn], ver[2 * maxn], nxt[2 * maxn];
int d[maxn], sz[maxn], rt[maxn];
int cnt, lc[maxn * 50], rc[maxn * 50]; ll sum[maxn * 50]; int n;
void add(int x, int y) { ver[++tot] = y, nxt[tot] = head[x], head[x] = tot; }
void update(int &p, int l, int r, int x, int v) { if (!p) p = ++cnt; if (l == r) { sum[p] += v; return; } int mid = (l + r) >> 1; if (x <= mid) update(lc[p], l, mid, x, v); else update(rc[p], mid + 1, r, x, v); sum[p] = sum[lc[p]] + sum[rc[p]]; }
int merge(int p, int q, int l, int r) { if (!p || !q) return p + q; if (l == r) { sum[++cnt] = sum[p] + sum[q]; return cnt; } int mid = l + r >> 1; int u = ++cnt; lc[u] = merge(lc[p], lc[q], l, mid); rc[u] = merge(rc[p], rc[q], mid + 1, r); sum[u] = sum[lc[u]] + sum[rc[u]]; return u; }
void dfs(int x, int f) { d[x] = d[f] + 1; sz[x] = 1; for (int i = head[x]; i; i = nxt[i]) { int y = ver[i]; if (y == f) continue; dfs(y, x); sz[x] += sz[y]; rt[x] = merge(rt[x], rt[y], 1, n); } update(rt[x], 1, n, d[x], sz[x] - 1); }
ll ask(int p, int l, int r, int L, int R) { if (L <= l && r <= R) return sum[p]; ll ans = 0; int mid = (l + r) >> 1; if (L <= mid) ans += ask(lc[p], l, mid, L, R); if (R > mid) ans += ask(rc[p], mid + 1, r, L, R); return ans; }
int main() { int q; scanf("%d%d", &n, &q); for (int i = 1, x, y; i < n; i++) { scanf("%d%d", &x, &y); add(x, y), add(y, x); } dfs(1, 0); for (int i = 1, a, k; i <= q; i++) { scanf("%d%d", &a, &k); ll ans = 1ll * min(k, d[a] - 1) * (sz[a] - 1) + ask(rt[a], 1, n, d[a] + 1, min(d[a] + k, n)); printf("%lld\n", ans); } }
|