Cod sursa(job #588680)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 9 mai 2011 09:00:43
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 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,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;
}