Cod sursa(job #2719462)

Utilizator Rares09Rares I Rares09 Data 9 martie 2021 21:19:12
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#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;
}