Cod sursa(job #1755765)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 11 septembrie 2016 00:10:50
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>

using namespace std;
const int NMAX=100005;
int nr, l;
int rmq[20][NMAX<<1], vis[NMAX], first[NMAX], euler[NMAX], log2[NMAX<<1];
vector<int> g[NMAX];

void dfs(int node, int f)
{
    vis[node]=vis[f]+1;
    euler[++nr]=node;
    first[node]=nr;
    for(int i=0; i<g[node].size(); i++)
    {
        dfs(g[node][i], node);
        euler[++nr]=node;
    }
}

int main()
{
    ifstream in("lca.in");
    ofstream out("lca.out");
    int n, m;
    in>>n>>m;
    for(int i=1; i<n; i++)
    {
        int x;
        in>>x;
        g[x].push_back(i+1);
    }
    dfs(1, 0);
    log2[1]=0;
    for(int i=2; i<=nr; i++)
        log2[i]=log2[i/2]+1;
    for(int i=1; i<=nr; i++)
        rmq[0][i]=euler[i];
    for(int i=1; (1<<i)<=nr; i++)
        for(int j=1; j<=nr-(1<<i)+1; j++)
        {
            int l=(1<<(i-1));
            if(vis[rmq[i-1][j]]<vis[rmq[i-1][j+l]])
                rmq[i][j]=rmq[i-1][j];
            else
                rmq[i][j]=rmq[i-1][j+l];
        }
    for(int i=1; i<=m; i++)
    {
        int u, v;
        in>>u>>v;
        u=first[u];
        v=first[v];
        if(u>v)
            swap(u, v);
        int diff=v-u+1;
        l=log2[diff];
        if(vis[rmq[l][u]]<vis[rmq[l][v-(1<<l)+1]])
            out<<rmq[l][u]<<'\n';
        else
            out<<rmq[l][v-(1<<l)+1]<<'\n';
    }
    return 0;
}