Cod sursa(job #1142169)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 13 martie 2014 16:16:34
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
using namespace std;
vector <int> fii[100001];
int adan[100001];
int euler[100001][20];
int poz[100001];
int leu;
int admin(int a, int b)
{
    if(adan[a]<adan[b])
        return a;
    return b;
}
void dfeu(int vf,int ad)
{
    int i;
    adan[vf]=ad;
    leu++;
    poz[vf]=leu;
    euler[leu][0]=vf;
    for(i=0;i<fii[vf].size();i++)
	{
		dfeu(fii[vf][i],ad+1);
		leu++;
		euler[leu][0]=vf;
	}
}
int main()
{
    int n,m;
    int i;
    int xx,yy;
    int p,lim;
    ifstream f("lca.in");
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>xx;
        fii[xx].push_back(i);
    }
    dfeu(1,1);
    ofstream g("lca.out");
    for(p=1;(1<<p)<=leu;p++)
        for(i=1;(i+(1<<p)-1)<=leu;i++)
             euler[i][p]=admin(euler[i][p-1],euler[i+(1<<(p-1))][p-1]);
    for(i=1;i<=m;i++)
    {
        f>>xx>>yy;
        if(poz[xx]<poz[yy])
        {
            lim=poz[yy]-poz[xx]+1;
            for(p=0;(1<<p)<=lim;p++);
            p--;
            g<<admin(euler[poz[xx]][p],euler[poz[yy]-(1<<p)+1][p]);
        }
        else
        {
            lim=poz[xx]-poz[yy]+1;
            for(p=0;(1<<p)<=lim;p++);
            p--;
            g<<admin(euler[poz[yy]][p],euler[poz[xx]-(1<<p)+1][p]);
        }
        g<<'\n';
    }
    f.close();
    g.close();
    return 0;
}