Cod sursa(job #1526157)

Utilizator geniucosOncescu Costin geniucos Data 15 noiembrie 2015 23:43:29
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#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;
}