Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- #define pb push_back
- #define endl "\n"
- using namespace std;
- const int N = 3e5 + 10;
- vector<int> gr[N], tin(N), tout(N), dep(N);
- int up[N][20], timer;
- void calc(int v, int pr = 1) {
- up[v][0] = pr;
- for(int i = 1; i < 20; i++) {
- up[v][i] = up[up[v][i - 1]][i - 1];
- }
- tin[v] = timer++;
- for(auto it: gr[v]) {
- if(it != pr) {
- dep[it] = dep[v] + 1;
- calc(it, v);
- }
- }
- tout[v] = timer++;
- }
- bool upper(int a, int b) {
- return tin[a] <= tin[b] && tout[a] >= tout[b];
- }
- int lca(int a, int b) {
- if(upper(a, b)) return a;
- if(upper(b, a)) return b;
- for(int i = 19; i >= 0; i--) {
- if(!upper(up[a][i], b)) {
- a = up[a][i];
- }
- }
- return up[a][0];
- }
- int dist(int a, int b) {
- return dep[a] + dep[b] - 2 * dep[lca(a, b)];
- }
- int getpar(int v, int l) {
- for(int i = 19; i >= 0; i--) {
- if((1 << (i)) <= l) {
- l -= (1 << (i));
- v = up[v][i];
- }
- }
- return v;
- }
- main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int n;
- cin >> n;
- for(int i = 1; i < n; i++) {
- int l, r;
- cin >> l >> r;
- gr[l].pb(r);
- gr[r].pb(l);
- }
- calc(1);
- int q;
- cin >> q;
- while(q--) {
- int l, r;
- cin >> l >> r;
- int e;
- cin >> e;
- if(dist(l, r) <= e) {
- cout << r << endl;
- } else {
- int mid = lca(l, r);
- if(e < dist(l, mid)) {
- cout << getpar(l, e) << endl;
- continue;
- }
- if(e == dist(l, mid)) {
- cout << mid << endl;
- continue;
- }
- e -= dist(l, mid);
- e = dist(mid, r) - e;
- cout << getpar(r, e) << endl;
- }
- }
- }
Add Comment
Please, Sign In to add comment