Cod sursa(job #2523459)

Utilizator KataIsache Catalina Kata Data 14 ianuarie 2020 10:01:16
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct {int val;int ind;} rmq[200005][30];
int doi[200005],nr,d[200005],first[200005],v[200005];
vector <int> G[200005];
void dfs(int nod);
int main()
{
    int n,i,m,j,x,y;
    fin>>n>>m;
    for(i=2;i<=n;i++)
    {
        fin>>x;
        G[x].push_back(i);
    }
    d[0]=-1;
    dfs(1);
    for(i=1;i<=nr;i++)
        if(!first[v[i]])
            first[v[i]]=i;
    for(i=1;i<=nr;i++) {rmq[i][0].val=d[v[i]]; rmq[i][0].ind=v[i];}
    //RMQ
    for(i=2;i<=nr;i++)
        doi[i]=doi[i/2]+1;
    for(j=1;j<=doi[nr];j++)  //lungimi
        for(i=1;i<=nr;i++)   //inceput
            if(rmq[i][j-1].val<=rmq[i+(1<<(j-1))][j-1].val) rmq[i][j].val=rmq[i][j-1].val, rmq[i][j].ind=rmq[i][j-1].ind;
            else rmq[i][j].val=rmq[i+(1<<(j-1))][j-1].val, rmq[i][j].ind=rmq[i+(1<<(j-1))][j-1].ind;

    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        x=first[x];
        y=first[y];
        if(x>y) swap(x,y);
        if(rmq[x][doi[y-x]].val <= rmq[y-(1<<doi[y-x])+1][doi[y-x]].val)
        fout<< rmq[x][doi[y-x]].ind;
        else fout<<rmq[y-(1<<doi[y-x])+1][doi[y-x]].ind;
        fout<<'\n';
    }
    return 0;
}

void dfs(int nod)
{
    v[++nr]=nod;
    for(int i=0;i<G[nod].size();i++)
        {
            d[G[nod][i]]=d[nod]+1;
            dfs(G[nod][i]);
            v[++nr]=nod;
        }
}