Pagini recente » Cod sursa (job #481432) | Cod sursa (job #271) | Cod sursa (job #1162457) | Cod sursa (job #3202869) | Cod sursa (job #1142169)
#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;
}