Pagini recente » Cod sursa (job #2535338) | Cod sursa (job #650311) | Cod sursa (job #3206109) | Cod sursa (job #1039138) | Cod sursa (job #2719427)
#include <fstream>
#include <vector>
#define INF 999999999
#define NMAX 100008
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
int n, m, pxy;
int v[32][2 * NMAX], dep[2 * NMAX], fir[NMAX], wid[2 * NMAX];
vector <int> s[NMAX];
void RMQ()
{
for(int i = 1; i <= pxy; ++i)
{
v[0][i] = i;
}
for(int i = 1; (1 << i) - 1 <= pxy; ++i)
{
for(int j = 1; j + (1 << i) - 1 <= pxy; ++j)
{
if(dep[v[i - 1][j]] < dep[v[i - 1][j + (1 << (i-1))]])
v[i][j] = v[i - 1][j];
else v[i][j] = v[i - 1][j + (1 << (i-1))];
}
}
}
int query(int a, int b)
{
if(b < a)
swap(a, b);
int l = b - a + 1, p2 = 1, pp2=0;
while(p2 <= l)
p2 *= 2, ++pp2;
p2 /= 2;
--pp2;
if(dep[v[pp2][a]] < dep[v[pp2][b - p2 + 1]])
return v[pp2][a];
else return v[pp2][b - p2 + 1];
}
void dfse(int pos, int depth)
{
fir[pos] = ++pxy;
dep[pxy] = depth;
wid[pxy] = pos;
for(auto it = s[pos].begin(); it != s[pos].end(); ++it)
{
dfse(*it, depth + 1);
++pxy;
dep[pxy] = depth;
wid[pxy] = pos;
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i < n; ++i)
{
int x;
cin >> x;
s[x].push_back(i + 1);
}
dfse(1, 1);
RMQ();
for(int i = 1; i <= m; ++i)
{
int a, b;
cin >> a >> b;
cout << wid[query(fir[a], fir[b])] << '\n';
}
return 0;
}