Cod sursa(job #1526197)

Utilizator geniucosOncescu Costin geniucos Data 16 noiembrie 2015 00:16:12
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#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';
}