倍增求LCA模板
#include <bits/stdc++.h> using namespace std; const int maxn = 5e5 + 5; const int maxm = 1e6 + 5; struct edge { int next, v; }E[maxm]; int head[maxn]; int tot = 0; int root; void addedge(int u, int v) { E[++tot].next = head[u]; E[tot].v = v; head[u] = tot; } int dep[maxn]; int pa[maxn][25]; void dfs(int u, int depth) { dep[u] = depth; for (int i = head[u]; i; i = E[i].next) { int v = E[i].v; if (!dep[v] && v != root) { pa[v][0] = u; dfs(v, depth + 1); } } } void getparent(int n) { for (int j = 1; j <= 20; j++) { for (int i = 1; i <= n; i++) { pa[i][j] = pa[pa[i][j - 1]][j - 1]; } } } int lca