Pagini recente » Cod sursa (job #2060123) | Cod sursa (job #679523) | Cod sursa (job #2881011) | Cod sursa (job #1445107) | Cod sursa (job #588679)
Cod sursa(job #588679)
#include<fstream>
#include<vector>
#define maxn 100005
using namespace std;
int n,m,nr[maxn],tt[maxn],t[maxn],inf[maxn],sol[2000005],st[maxn],dr[maxn],tmp;
vector <int> v[maxn];
vector <pair<int, int > > a[maxn];
void solve(int i)
{
int R,x,y,ind,aux;
vector<int> :: iterator it;
vector< pair<int, int > > :: iterator it2;
nr[i]=1;
tt[i]=i;
inf[i]=i;
for (it=v[i].begin();it<v[i].end();++it)
{
solve(*it);
x=*it;
for (x=*it;tt[x]!=x;x=tt[x]);
for (y=i;tt[y]!=y;y=tt[y]);
if (nr[x]>nr[y])
{
tt[y]=x;
inf[x]=inf[y];
}
else
if (nr[x]<nr[y])
tt[x]=y;
else
if (nr[x]==nr[y])
{
tt[x]=y;
nr[y]++;
}
}
for (it2=a[i].begin();it2<a[i].end();++it2)
{
x=(*it2).first;
ind=(*it2).second;
y=x;
for (;x!=tt[x];x=tt[x]);
sol[ind]=inf[x];R=x;
for (x=y;x!=tt[x];aux=x,x=tt[x],tt[aux]=R);
}
}
void df ( int i )
{
vector<int > :: iterator it;
st[i]=++tmp;
for (it=v[i].begin();it<v[i].end();++it)
df(*it);
dr[i]=tmp;
}
void citire()
{
int x,y,i;
char s2[30];
ifstream f("lca.in");
f>>n>>m;
for (i=1;i<n;++i)
{
f>>x;
v[x].push_back(i+1);
t[i+1]=x;
}
df(1);
for (i=1;i<=m;++i)
{
f.get();
f.get(s,29);
f>>x>>y;
if (dr[x]<dr[y] || dr[x]==dr[y] && st[x]>st[y])
a[y].push_back(make_pair(x,i));
else
a[x].push_back(make_pair(y,i));
}
}
void afisare()
{
int i;
vector<int> :: iterator it;
ofstream g("lca.out");
for (i=1;i<=m;i++)
g<<sol[i]<<'\n';
g.close();
}
int main()
{
citire();
solve(1);
afisare();
return 0;
}