Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- //speed coding
- #define mp make_pair
- #define cve(a) for (auto i : a) {cout << i << " "; } cout << "\n";
- #define f first
- #define s second
- #define loop(x, n) for (int i = x; i < n; i++)
- #define joop(x, n) for (ll j = x; j < n; j++)
- #define err cout << "ERROR" << endl;
- #define all(x) x.begin(), x.end()
- #define pb push_back
- #define sz(x) x.size()
- // types
- #define pii pair<int, int>
- #define pll pair<ll, ll>
- #define vvi vector<vector<int>>
- #define vvll vector<vector<ll>>
- typedef long long ll;
- // types of data
- #define inf 1000000000
- #define infll 1000000000000000000
- #define mod 1000000009
- #define DEBUG 1
- using namespace std;
- const int logn = 20, maxn = 1e5 * 2 +10;
- vector<vector<int>> g;
- int par[maxn][logn] = {-1};
- vector<int> used, tin, tout;
- int t = 0;
- void dfs1(int v, int p = -1){
- // par[v][0] = p;
- used[v] = 1;
- tin[v] = t++;
- loop(1, logn){
- // par[v][i] = par[par[v][i-1]][i-1]
- par[v][i] = par[par[v][i-1]][i-1];
- int t = par[v][i-1];
- if(t == -1) par[v][i] = par[par[v][i-1]][i-1];
- else par[v][i] = -1;
- }
- for(auto to : g[v] ){
- if(used[to] == 0 ){
- par[to][v] = v;
- dfs1(to);
- }
- }
- tout[v] = t;
- }
- void dfs(int v){
- used[v] = 1;
- loop(1, logn){
- int t = par[v][i-1];
- if(t != -1 ) par[v][i] = par[t][i-1];
- else par[v][i] = -1;
- }
- for(auto to : g[v] ){
- if(used[to] == 0 ){
- par[to][0] = v;
- dfs(to);
- }
- }
- }
- bool ch(int v, int a){
- return tin[v] < tin[a] && tout[v] >= tout[a];
- }
- int kth(int u, int k){
- loop(0, logn){
- cout << u << " ";
- if(u == -1) break;
- if(k%2 == 1){
- // err
- cout << endl << u << " " << k << " " << i << endl;
- u = par[u][i];
- // cout << endl << u << " " << k << endl;
- }
- k/=2;
- }
- cout << endl;
- return u;
- }
- //int lca(int a, int b){
- // if(ch(a, b)) return a;
- // if(ch(b, a)) return b;
- // for(int i = logn-1; i >= 0; i--){
- // if(!ch(par[a][i], b)){
- // a = par[a][i];
- // }
- // }
- // return par[a][0];
- //}
- bool is_anc(int p, int v){
- return tin[p] <= tin[v] && tout[v] >= tout[p];
- }
- //int lca(int a, int b){
- // if(is_anc(b, a)) return b;
- // if(is_anc(a, b)) return a;
- // for(int i = logn-1; i >= 1; i++){
- // int t = par[i][a];
- // if( t!= -1 && !is_anc(t, b)) a = t;
- // }
- // return par[0][a];
- //}
- void solve(){
- int n;
- cin >> n;
- used.resize(n, 0);
- g.resize(n);
- tin.resize(n);
- tout.resize(n);
- // par.resize(T, vector<int> (n, -1));
- loop(0, n-1){
- int a, b;
- cin >> a >> b;
- a--, b--;
- g[a].pb(b);
- g[b].pb(a);
- }
- dfs(0);
- int m;
- cin >> m;
- loop(0, m){
- int u, k;
- cin >> u >> k;
- u--;
- // int kkt = kth(u, k);
- int ans = kth(u, k) == -1 ? -1 : kth(u, k);
- // cout << ans <<"\n";
- }
- // for(auto i : par[7]){
- // cout << i << " ";
- // }
- // cout << par[7][2];
- }
- int main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- #ifdef DEBUG
- freopen("text.txt", "r", stdin);
- #else
- #endif
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment