Pagini recente » Cod sursa (job #725904) | Cod sursa (job #911652) | Cod sursa (job #1971147) | Cod sursa (job #3261954) | Cod sursa (job #588680)
Cod sursa(job #588680)
#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,j;
char s[50];
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,40);
s[strlen(s)]=0;
x=0;y=0;j=0;
while(s[j]>='0' && s[j]<='9')
x=x*10+(s[j]-'0'),++j;
++j;
while (s[j]!=0)
y=y*10+(s[j]-'0'),++j;
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));
s[0]=0;
}
}
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;
}