fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. #define BIT(i) (1LL << i)
  5. typedef long long ll;
  6. const int MAXN = 1e5 + 7;
  7. int par[MAXN][27], h[MAXN], n, k;
  8. int root = 1;
  9. vector <int> a[MAXN];
  10. void dfs(int u, int p = 0){
  11. par[u][0] = p;
  12. h[u] = h[p] + 1;
  13. for(int i = 1; i <= 25; i++) par[u][i] = par[par[u][i - 1]][i - 1];
  14. for(auto v : a[u]) if(v != p) {
  15. dfs(v, u);
  16. }
  17. }
  18.  
  19. int lca(int u, int v){
  20. if(h[u] < h[v]) swap(u, v);
  21. int x = h[u] - h[v];
  22. for(int i = __lg(x); i >= 0; i--){
  23. if(x >= BIT(i)){
  24. x -= BIT(i);
  25. u = par[u][i];
  26. }
  27. }
  28. if(u == v) return u;
  29. for(int i = __lg(h[u]); i >= 0; i--){
  30. if(par[u][i] != par[v][i]){
  31. u = par[u][i];
  32. v = par[v][i];
  33. }
  34. }
  35. return par[v][0];
  36. }
  37.  
  38.  
  39. int main(){
  40. ios_base::sync_with_stdio(0);
  41. cout.tie(0);
  42. cin.tie(0);
  43. while(cin >> n) {
  44. if(n == 0) break;
  45. root = 1;
  46. for(int i=1; i<=n; i++) a[i].clear();
  47. for(int i = 1; i <= n - 1; i++){
  48. int x, y;
  49. cin >> x >> y;
  50. a[x].pb(y);
  51. a[y].pb(x);
  52. }
  53. dfs(root);
  54. // for(int i=0; i<=n; i++) cout << h[i] << " "; cout << "\n";
  55. for(int i=1; i<=n; i++) assert(h[i] > 0);
  56. cin >> k;
  57. while(k--){
  58. int u, v;
  59. char q;
  60. cin >> q;
  61. if(q == '!') cin >> root;
  62. else{
  63. cin >> u >> v;
  64. int uv = lca(u, v);
  65. int ur = lca(u, root);
  66. int vr = lca(v, root);
  67. vector<int> ans = {uv, ur, vr};
  68. sort(ans.begin(), ans.end(), [&](int a, int b) {return h[a] < h[b];});
  69. cout << ans.back() << "\n";
  70. }
  71. }
  72. }
  73. }
  74.  
Success #stdin #stdout 0.01s 7788KB
stdin
9
1 2
1 3
2 4
2 5
3 6
3 7
6 8
6 9
5
? 4 5
? 5 6
? 8 7
! 6
? 8 7
9
1 2
1 3
2 4
2 5
3 6
3 7
6 8
6 9
5
? 4 5
? 5 6
? 8 7
! 6
? 8 7
9
1 2
1 3
2 4
2 5
3 6
3 7
6 8
6 9
5
? 4 5
? 5 6
? 8 7
! 6
? 8 7
9
1 2
1 3
2 4
2 5
3 6
3 7
6 8
6 9
5
? 4 5
? 5 6
? 8 7
! 6
? 8 7
0
stdout
2
1
3
6
2
1
3
6
2
1
3
6
2
1
3
6