-
Notifications
You must be signed in to change notification settings - Fork 184
/
Copy path1135.cc
78 lines (72 loc) · 1.39 KB
/
1135.cc
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
// https://cses.fi/problemset/task/1135
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;
int n, q, u, v;
vi a, d;
vvi g, anc;
void dfs(int u, int p) {
if (p != -1) {
a[u] = p;
d[u] = d[p] + 1;
}
for (auto z:g[u]) {
if (z == p) continue;
dfs(z, u);
}
}
void ancestors() {
anc.push_back(vi(n));
for (int i = 0; i < n; i++) anc[0][i] = a[i];
for (int i = 1, j = 1; i < n; i *= 2, j++) {
anc.push_back(vi(n));
for (int k = 0; k < n; k++) anc[j][k] = anc[j-1][anc[j-1][k]];
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
g = vvi(n);
a = vi(n); d = vi(n);
for (int i = 0; i < n - 1; i++) {
cin >> u >> v;
u--; v--;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(0, -1);
ancestors();
for (int i = 0; i < q; i++) {
cin >> u >> v;
u--; v--;
int c = d[u] + d[v];
while (d[u] > d[v]) {
int b = d[u] - d[v];
int k = 1, j = 0;
while (k*2 < b) {
j++;
k *= 2;
}
u = anc[j][u];
}
while (d[v] > d[u]) {
int b = d[v] - d[u];
int k = 1, j = 0;
while (k*2 < b) {
j++;
k *= 2;
}
v = anc[j][v];
}
while (u != v) {
int j = 0;
while (anc[j+1][u] != anc[j+1][v]) j++;
u = anc[j][u];
v = anc[j][v];
}
cout << c - 2 * d[u] << endl;
}
}