Cod sursa(job #2503857)

Utilizator ancaoxoxSfia Anca ancaoxox Data 3 decembrie 2019 20:51:40
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");

int rng[200005], n, e[200005], first[100005], rmqq[20][200005], log2[200005], cnt=1;
vector<int> v[100005];

void dfs(int nod, int dpt){
        e[cnt]=nod;
        rng[cnt]=dpt;
        first[nod]=cnt;
        cnt++;

        for (int i=0; i<v[nod].size(); i++)
        {
            dfs(v[nod][i], dpt+1);

            e[cnt]=nod;
            rng[cnt]=dpt;
            cnt++;
        }
}


int main()
{
    int m, a, i, j, s, p, q, k, rez, b, t;
    cin >> n >> m;

    for (i=2; i<=n; i++){
        cin >> a;
        v[a].push_back(i);
    }


    dfs(1, 0);

    log2[1]=0;
    for (i=2; i<=cnt; i++)
    log2[i]=log2[i>>1]+1;

    cnt--;

    for (i=1; i<=cnt; i++)
    rmqq[0][i]=i;



    for (i=1; (1<<i)<cnt; i++)
        for (j=1; j<=cnt-(1<<i); j++)
        {
            rmqq[i][j]=rmqq[i-1][j];
            if (rng[rmqq[i-1][j]]>rng[rmqq[i-1][j+(1<<(i-1))]])
            rmqq[i][j]=rmqq[i-1][j+(1<<(i-1))];
        }



    for (i=1; i<=m; i++)
    {
        cin >>a >> b;
        p=min(first[a], first[b]);
        q=max(first[a], first[b]);
        k=q-p+1;
        t=log2[k];
        rez=rmqq[t][p];
        if (rng[rmqq[t][p]]>rng[rmqq[t][q-(1<<t)+1]])
        rez=rmqq[t][q-(1<<t)+1];
        cout << e[rez] << '\n';
    }









    return 0;
}