Cod sursa(job #1328446)

Utilizator AeroHHorea Stefan AeroH Data 28 ianuarie 2015 13:17:06
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb

#include <fstream>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <map>
#include <vector>
#define punct pair<long long int,long long int>
#define x first

#define y second
#define eps 0.00000000000000001
#define MOD 1000000007
using namespace std;

int n,m;
vector<int> v[100001],euler;
int rmq[20][400005],lg,fv[100001],doi[400001],pos[400001],i,j,a,x,y;

void df(int i)
    {
        ++fv[i];
        euler.push_back(i);
        for (int j=0;j<v[i].size();++j)
            {
                if (!fv[v[i][j]])
                    ++fv[v[i][j]],df(v[i][j]);
                euler.push_back(i);
            }
    }
ifstream f("lca.in");
ofstream g("lca.out");
int main()
{
    /*ios_base::sync_with_stdio(false);
    #ifndef ONLINE_JUDGE
        ifstream cin(".in");
        ofstream cout(".out");
    #endif*/


    f>>n>>m;
    for (i=1;i<n;++i)
        {
            f>>a;
            v[a].push_back(i+1);
        }
    euler.push_back(0);
    df(1);

    for(i=0;i<euler.size();++i)
            rmq[0][i]=euler[i];

    for(i=0;i<euler.size();++i)
        if (!pos[euler[i]])
            pos[euler[i]]=i;

    n=euler.size();
    int ct=0;
    for (i=0;i<=n;++i)
        {
            if (1<<(ct+1)<=i)
                ++ct;
            doi[i]=ct;
        }

    for (i=1;1<<i<=euler.size();++i)
        for (j=1;j<=n-(1<<(i-1))+1;++j)
            rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);

    //for (i=0;i<=10;++i,g<<'\n')
    //    for (j=1;j<=30;++j)
    //        g<<rmq[i][j]<<" ";
    while(m--)
        {
            f>>x>>y;
            lg=doi[pos[y]-pos[x]];
            g<<min(rmq[lg][pos[x]],rmq[lg][pos[y]-(1<<lg)])<<'\n';
        }













    return 0;
}