Pagini recente » Cod sursa (job #2610557) | Cod sursa (job #2832851) | Cod sursa (job #1424887) | Cod sursa (job #222612) | Cod sursa (job #661348)
Cod sursa(job #661348)
#include <fstream>
#include <vector>
using namespace std;
typedef vector<int> VI;
typedef VI::const_iterator CIT;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX = 100005 , MAXL = 20;
VI G[NMAX];
int N , Q , K , x , y;
int rmq[MAXL][NMAX] , H[NMAX<<1] , Lev[NMAX<<1] , First[NMAX<<1] , Lg[NMAX<<1];
void read_data()
{
fin>>N>>Q;
for(int i = 2;i <= N;++i)
{
fin>>x;
G[x].push_back(i);
}
}
void df(int node,int lev)
{
H[++K] = node;
Lev[K] = lev;
First[node] = K;
for(CIT w = G[node].begin();w != G[node].end();++w)
{
df(*w,lev + 1);
H[++K] = node;
Lev[K] = lev;
}
}
void RMQ()
{
rmq[0][1] = 1;
for(int i = 2;i <= K;++i)
Lg[i] = Lg[i>>1] + 1 , rmq[0][i] = i;
for(int i = 1;(1<<i) < K;++i)
for(int j = 1;j <= K - (1<<i);++j)
rmq[i][j] = Lev[rmq[i-1][j]] < Lev[rmq[i-1][j + (1<<(i-1))]] ? rmq[i-1][j] : rmq[i-1][j + (1<<(i-1))];
}
int lca(int x, int y)
{
int diff, l, sol, sh;
int a = First[x], b = First[y];
if(a > b) swap(a, b);
diff = b - a + 1;
l = Lg[diff];
sol = rmq[l][a];
sh = diff - (1 << l);
if(Lev[sol] > Lev[rmq[l][a + sh]])
sol = rmq[l][a + sh];
return H[sol];
}
int main()
{
read_data();
df(1,0);
RMQ();
for(;Q;Q--)
{
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
return 0;
}