Pagini recente » Cod sursa (job #2574314) | Cod sursa (job #2668637) | Cod sursa (job #1578063) | Cod sursa (job #426752) | Cod sursa (job #2371591)
#include <iostream>
#include <fstream>
#define NMAX 100005
#define INF 2000000000
using namespace std;
struct elem
{
int val,niv;
bool operator <(const elem& x2) const
{
return niv<x2.niv;
}
} tree[NMAX*4];
struct up
{
int poz;
elem val;
} update;
struct q
{
int start,finish;
} query;
struct nod
{
int fiu;
nod* next;
}*a[NMAX];
int n,euler[NMAX*2],neuler,nivel[NMAX*2],first[NMAX];;
void runupdate(int st,int dr,int postree)
{
if (st==dr)
{
tree[postree]=update.val;
return;
}
int mij=(st+dr)/2;
if (update.poz<=mij)
runupdate(st,mij,2*postree);
else
runupdate(mij+1,dr,2*postree+1);
tree[postree]=min(tree[2*postree],tree[2*postree+1]);
}
elem runquery(int st,int dr,int postree)
{
if (st>=query.start&&dr<=query.finish)
return tree[postree];
if (st>query.finish||dr<query.start)
{
elem aux;
aux.val=INF;
aux.niv=INF;
return aux;
}
int mij=(st+dr)/2;
return min(runquery(st,mij,2*postree),runquery(mij+1,dr,2*postree+1));
}
void dfs(int x,int niv)
{
euler[++neuler]=x;
nivel[neuler]=niv;
first[x]=neuler;
for (nod *i=a[x]; i; i=i->next)
{
dfs(i->fiu,niv+1);
euler[++neuler]=x;
nivel[neuler]=niv;
}
}
int main()
{
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int m;
fin>>n>>m;
for(int i=1; i<n; i++)
{
int x;
fin>>x;
nod* nou=new nod;
nou->fiu=i+1;
nou->next=a[x];
a[x]=nou;
}
dfs(1,0);
for (int i=1; i<=neuler; i++)
{
elem aux;
aux.val=euler[i];
aux.niv=nivel[i];
update.val=aux;
update.poz=i;
runupdate(1,neuler,1);
}
for (int i=1; i<=m; i++)
{
int x,y;
fin>>x>>y;
query.start=first[x];
query.finish=first[y];
if (query.start>query.finish)
swap(query.start,query.finish);
elem da=runquery(1,neuler,1);
fout<<da.val<<'\n';
}
return 0;
}