Pagini recente » Cod sursa (job #340169) | Cod sursa (job #1617583) | Cod sursa (job #1337640) | Cod sursa (job #1723408) | Cod sursa (job #1526197)
#include<cstdio>
#include<vector>
using namespace std;
int N, M, vctr[100009], t[100009], rnk[100009], ans[2000009], x[2000009], y[2000009], sz[100009];
bool ap[100009];
vector < int > v[100009];
int **h = new int *[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);
t[x] = y;
}
void solve (int nod)
{
t[nod] = vctr[nod] = nod, rnk[nod] = 0;
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 (int i=0; i<sz[nod]; i++)
{
int pos = h[nod][i], vec;
if (x[pos] == nod) vec = y[pos];
else vec = x[pos];
if (ap[vec] == 1 && ans[pos] == 0)
ans[pos] = vctr[tata (vec)];
}
}
void Read (int &x);
int main ()
{
freopen ("lca.in", "r", stdin);
freopen ("lca.out", "w", stdout);
Read (N), Read (M);
for (int i=2; i<=N; i++)
{
int t;
Read (t), v[t].push_back (i);
}
for (int i=1; i<=M; i++)
Read (x[i]), Read (y[i]), sz[x[i]] ++, sz[y[i]] ++;
for (int i=1; i<=N; i++)
h[i] = new int[sz[i]], sz[i] = 0;
for (int i=1; i<=M; i++)
h[x[i]][sz[x[i]] ++] = i, h[y[i]][sz[y[i]] ++] = i;
solve (1);
for (int i=1; i<=M; i++)
printf ("%d\n", ans[i]);
return 0;
}
#define maxl 100000
int pos = maxl - 1;
char sir[maxl];
void Next ()
{
if (++pos == maxl)
fread (sir, 1, maxl, stdin), pos = 0;
}
void Read (int &x)
{
for (;sir[pos] < '0' || sir[pos] > '9'; Next ()) ;
for (x = 0; sir[pos] >= '0' && sir[pos] <= '9'; Next ()) x = x * 10 + sir[pos] - '0';
}