Pagini recente » Cod sursa (job #557791) | Cod sursa (job #1779513) | Cod sursa (job #2593092) | Cod sursa (job #1235629) | Cod sursa (job #3272941)
#include <fstream>
#include <vector>
#define dim 100000
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n,q,x,y,viz[dim+1],sol[20*dim+1];
struct query
{
int nod,pos;
};
vector <query> qry[dim+1];
vector <int> v[dim+1];
struct DSU
{
int t[dim+1];
void init ()
{
for (int i=1; i<=n; i++)
t[i]=i;
}
int rad (int x)
{
if (x==t[x])
return x;
return t[x]=rad (t[x]);
}
void reun (int x,int y)
{
t[rad (y)]=rad (x);
}
};
DSU pmd;
void dfs (int nod)
{
viz[nod]=1;
for (int i=0; i<(int)v[nod].size (); i++)
{
int vecin=v[nod][i];
dfs (vecin);
pmd.reun (nod,vecin);
}
for (int i=0; i<(int)qry[nod].size (); i++)
{
if (viz[qry[nod][i].nod])
sol[qry[nod][i].pos]=pmd.rad (qry[nod][i].nod);
}
}
int main()
{
fin>>n>>q;
pmd.init ();
for (int i=2; i<=n; i++)
{
fin>>x;
v[x].push_back (i);
}
for (int i=1; i<=q; i++)
{
fin>>x>>y;
qry[x].push_back ({y,i});
qry[y].push_back ({x,i});
}
dfs (1);
for (int i=1; i<=q; i++)
fout<<sol[i]<<"\n";
return 0;
}