Pagini recente » Cod sursa (job #2760439) | Cod sursa (job #2710008) | Cod sursa (job #2414268) | Cod sursa (job #2647285) | Cod sursa (job #1526157)
#include<cstdio>
#include<vector>
using namespace std;
int N, M, ap[100009], vctr[100009], t[100009], ans[2000009];
vector < int > v[100009];
vector < pair < int , int > > queries[100009];
int tata (int x)
{
if (x == t[x]) return x;
return t[x] = tata (t[x]);
}
void unite (int x, int y)
{
x = tata (x), y = tata (y);
if (x == y) return ;
t[x] = y;
}
void solve (int nod)
{
t[nod] = nod;
for (vector < int > :: iterator it = v[nod].begin (); it != v[nod].end (); it ++)
{
solve (*it);
unite (nod, *it);
vctr[tata (nod)] = nod;
}
ap[nod] = 1;
for (vector < pair < int , int > > :: iterator it = queries[nod].begin (); it != queries[nod].end (); it ++)
if (ap[it->first] == 1 && ans[it->second] == 0)
ans[it->second] = vctr[tata (it->first)];
}
int main ()
{
freopen ("lca.in", "r", stdin);
freopen ("lca.out", "w", stdout);
scanf ("%d %d", &N, &M);
for (int i=2; i<=N; i++)
{
int t;
scanf ("%d", &t), v[t].push_back (i);
}
for (int i=1; i<=M; i++)
{
int x, y;
scanf ("%d %d", &x, &y);
queries[x].push_back (make_pair (y, i));
queries[y].push_back (make_pair (x, i));
}
solve (1);
for (int i=1; i<=M; i++)
printf ("%d\n", ans[i]);
return 0;
}