#include <bits/stdc++.h>
#define F first
#define S second
#define pb(x) push_back(x)
#define mp(a, b) make_pair(a, b)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
const int MOD = 1e9 + 7;
const int LOG = 20;
vector< vi > adj;
vi level;
vi parent;
vector<bool> visited;
vector< vi > up;
vector< vi > lca_right;
vector< vi > lca_left;
int n;
void bfs(int src) {
	queue<int> q;
	q.push(src);
	while(!q.empty()) {
		int u = q.front();
		visited[u] = true;
		q.pop();
		for(auto v: adj[u]) {
			if(!visited[v]) {
				level[v] = level[u] + 1;
				parent[v] = u;
				up[v][0] = u;
				q.push(v);
			}
		}
	}
}
void fill_up() {
	for(int i = 1; i < LOG; ++i)
		for(int j = 0; j < n; ++j)
			if(up[j][i - 1] != -1)
				up[j][i] = up[up[j][i - 1]][i - 1];
}
int walk(int u, int k) {
	int node = u;
	int ct = 0;
	while(k) {
		if(k % 2)
			node = up[node][ct];
		ct++;
		if(ct > LOG)
			return -1;
		k /= 2;
	}
	return node;
}
int lca(int u, int v) {
	if(level[u] > level[v]) 
		swap(u, v);
	int diff = abs(level[u] - level[v]);
	v = walk(v, diff);
	if(u == v)
		return u;
	while(1) {
		int jump = 0;
		for(int k = 0; k < LOG; ++k) {
			if(up[u][k] == up[v][k])
				break;
			jump = k;
		}
		u = up[u][jump];
		v = up[v][jump];
		if(u == v)
			return u;
	}
}
vll two(LOG + 1, 1);
void fill_up_sparse() {
	for(int i = 0; i < n; ++i) {
		lca_right[i][0] = i;
		lca_left[i][0] = i;
	}

	for(int i = 1; i <= LOG; ++i)
		two[i] = two[i - 1] * 2ll;

	for(int i = 1; i < LOG; ++i) {
		for(int j = 0; j < n; ++j) {
			if(lca_right[j][i - 1] != -1 and ((j + two[i - 1]) < n) and (lca_right[j + two[i - 1]][i - 1] != -1))
				lca_right[j][i] = lca(lca_right[j][i - 1], lca_right[j + two[i - 1]][i - 1]);
		}
	}

	for(int i = 1; i < LOG; ++i) 
		for(int j = n - 1; j >= 0; j--) 
			if(lca_left[j][i - 1] != -1 and (j - two[i - 1]) >= 0 and lca_left[j - two[i - 1]][i -1] != -1)
				lca_left[j][i] = lca(lca_left[j][i - 1], lca_left[j - two[i - 1]][i -1]);
}
int lca_range(int l, int r) {
	int len = 0;
	for(int i = 0; i < LOG; ++i) {
		if(l + two[i] > r)
			break;
		len = i;
	}
	// if(l == 0 and r == 8)
	// 	cout << "***" << len << " " << lca_right[l][len] << " " << lca_left[r][len] << endl;
	return lca(lca_right[l][len], lca_left[r][len]);
}
int main() {
	std :: ios_base :: sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);
	cin >> n;
	adj.assign(n, vi());
	level.assign(n, 0);
	parent.assign(n, -1);
	visited.assign(n, false);
	up.assign(n, vi(LOG, -1));
	lca_left.assign(n, vi(LOG, -1));
	lca_right.assign(n, vi(LOG, -1));
	int q;
	cin >> q;
	int x, y;
	for(int i = 2; i <= n; ++i) {
		cin >> x;
		y = i;
		x--, y--;
		adj[x].pb(y);
		adj[y].pb(x);
	}
	bfs(0);
	fill_up();
	fill_up_sparse();
	int l, r;
	while(q--) {
		cin >> l >> r;
		l--, r--;
		int low = l;
		int high = r;
		int lca_LR = lca_range(l, r);
		int left = -1;
		int right = -1;
		while(low < high) {
			int mid = low + (high - low + 1) / 2;
			if(lca_range(l, mid) == lca_LR)
				high = mid - 1;
			else 
				low = mid;
		}
		if(lca_range(l, low) != lca_LR)
			left = low;
		if(left != -1 and left == r - 1) {
			cout << r + 1 << " " << level[lca_range(l, left)] << endl;
			continue;
		}
		low = l;
		high = r;
		while(low < high) {
			int mid = low + (high - low) / 2;
			if(lca_range(mid, r) == lca_LR)
				low = mid + 1;
			else
				high = mid;
		}
		if(lca_range(low, r) != lca_LR)
			right = low;
		if(right != -1 and right == l + 1) {
			cout << l + 1 << " " << level[lca_range(right, r)] << endl;
			continue;
		}
		if(left + 1 == right - 1) {
			cout << left + 2 << " " << level[lca(lca_range(l, left), lca_range(right, r))] << endl;
			continue;	
		}
		cout << l + 1 << " " << level[lca_LR] << endl;
	}
	return 0;
}
