rt,LCA。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e5 + 1;
long long n, m, a, b, root,num[3];
map<int, map<int, int>> st;
map<int, int> deep;
map<int, vector<int>> c;
void dfs(int x, int step) {
deep[x] = step;
for(int i = 0; i < c[x].size(); i++) {
if(deep[c[x][i]] == 0) {
dfs(c[x][i], step + 1);
st[c[x][i]][0] = x;
}
}
}
int LCA(int x, int y) {
if(deep[x] > deep[y]) {
swap(x, y);
}
for(int i = 21; i >= 0; i--) {
if(deep[st[y][i]] >= deep[x]) {
y = st[y][i];
}
}
if(x == y) {
return x;
}
for(int i = 21; i >= 0; i--) {
if(st[x][i] != st[y][i]) {
x = st[x][i], y = st[y][i];
}
}
return st[x][0];
}
signed main() {
// freopen("tree.in", "r", stdin);
// freopen("tree.out", "w", stdout);
cin >> a >> b;
c[a + b].push_back(a);
c[a + b].push_back(b);
num[0] = a;
num[1] = b;
num[2] = a + b;
dfs(a + b, 1);
for(int i = 1; i <= 21; i++) {
for(int j = 0; j < 3; j++) {
st[num[j]][i] = st[st[num[j]][i - 1]][i - 1];
}
}
cout << LCA(a, b);
return 0;
}