1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
   | #include<bits/stdc++.h> #define RG register #define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout); #define clear(x, y) memset(x, y, sizeof(x)); using namespace std;
  inline int read() { 	int data = 0, w = 1; 	char ch = getchar(); 	while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar(); 	if(ch == '-') w = -1, ch = getchar(); 	while(ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar(); 	return data*w; }
  const int maxn(300010), Log(21); struct edge { int next, to; } e[maxn << 1]; int head[maxn], e_num, n, m, f[maxn][Log]; inline void add_edge(int from, int to) { 	e[++e_num] = (edge) {head[from], to}; head[from] = e_num; 	e[++e_num] = (edge) {head[to], from}; head[to]   = e_num; }
  void dfs(int x) { 	for(RG int i = 1; i <= 20; i++) f[x][i] = f[f[x][i - 1]][i - 1]; 	for(RG int i = head[x]; i; i = e[i].next) 	{ 		int to = e[i].to; 		if(to == f[x][0]) continue; 		f[to][0] = x; dfs(to); 	} }
  inline int Query(int x, int k) { 	for(RG int i = 20; ~i; i--) if((k >> i) & 1) x = f[x][i]; 	return x; }
  int main() { 	n = read(); 	for(RG int i = 1; i < n; i++) add_edge(read(), read()); 	m = read(); int lastans = 0; dfs(1); 	while(m--) 	{ 		int a = read() ^ lastans, b = read() ^ lastans; 		printf("%d\n", lastans = Query(a, b)); 	} 	return 0; }
   |