代码全tle 但是给的数据却能过? 咋回事???
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
struct Node {
int to, nex;
}edge[maxn << 1];
int head[maxn], cnt;
void add(int l, int r) {
edge[++cnt].nex = head[l];
edge[head[l] = cnt].to = r;
}
ll len[maxn], d[maxn];
int n, m;
int dep[maxn];
int f[maxn][20];
int dfs_lca(int fa, int x) {
dep[x] = dep[fa] + 1;
f[x][0] = fa;
for (int j = 1; (1 << j) <= dep[x]; ++j) {
f[x][j] = f[f[x][j - 1]][j - 1];
}
for (int i = head[x]; i; i = edge[i].nex) {
int to = edge[i].to;
if (to == fa) continue;
dfs_lca(x, to);
}
}
int LCA(int x, int y) {
if (dep[x] < dep[y]) swap(x, y);
for (int i = log2(dep[x]) + 1; i >= 0; --i) {
if (dep[f[x][i]] >= dep[y]) x = f[x][i];
}
if (x == y) return x;
for (int i = log2(dep[x]) + 1; i >= 0; --i) {
if (f[x][i] != f[y][i]) {
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
int main() {
cin >> n >> m;
int s; cin >> s;
for (int i = 1, l, r; i < n; ++i) {
scanf("%d%d", &l, &r);
add(l, r);
add(r, l);
}
dfs_lca(s, s);
while (m--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", LCA(l, r));
}
return 0;
}