Cod sursa(job #2503822)

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

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

int rng[200005], n, tata[100005], e[200005], first[100005], l[200005], rmqq[20][200005], log2[200005], cnt=2;
vector<int> v[100005];
bool fol[100005];



void dfs(int nod){

    if (v[nod].size()>0)
    {for(int i=0;i<v[nod].size();i++)
        {
            if (fol[v[nod][i]]==0)
            {
                fol[v[nod][i]]=1;
                l[v[nod][i]]=l[nod]+1;
            }

            e[cnt]=v[nod][i];
            cnt++;
            dfs(v[nod][i]);
        }
        e[cnt]=tata[nod];
        cnt++;
    }
    else
    {e[cnt]=tata[nod];
    cnt++;}

    }



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



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

    e[1]=1;
    dfs(1);

    fol[1]=1;

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

    for (i=1; i<=cnt-1; i++)
    {
        if (fol[e[i]]==1)
        {
            fol[e[i]]=0;
            first[e[i]]=i;
        }
        rng[i]=l[e[i]];
    }



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


    for (i=1; i<=18; i++)
        for (j=1; j<=cnt-1; j++)
        {
            rmqq[i][j]=rmqq[i-1][j];
            if (j<=cnt-1-(1<<i))
            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 >>p >> q;
        p=min(first[p], first[q]);
        q=max(first[p], first[q]);
        k=q-p+1;
        t=log2[k];
        rez=rmqq[t][p];
        if (q-(1<<t)+1>=0)
        if (rng[rmqq[t][p]]>rng[rmqq[t][q-(1<<t)+1]] and rmqq[t][q-(1<<t)+1]!=0)
        rez=rmqq[t][q-(1<<t)+1];
        cout << e[rez] << '\n';
    }









    return 0;
}