Cod sursa(job #588679)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 9 mai 2011 08:51:53
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#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;
}