Cod sursa(job #588686)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 9 mai 2011 09:18:23
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 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]);
		y=tt[i];
		if (nr[y]>nr[x])
			tt[x]=y;
		else
		if (nr[x]>nr[y])
			tt[y]=x,inf[x]=inf[y];
		else
			{
				tt[x]=y;
				nr[y]++;
			}
		R=tt[x];
		for (x=*it;x!=R;y=x,x=tt[x],tt[y]=R);
		for (x=i;x!=R;y=x,x=tt[x],tt[y]=R);
			
	}
	
	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);
	f.get();
	for (i=1;i<=m;++i)
	{
		s[0]=0;
		f.get();
		f.get(s,40);
		j=0;
		x=y=0;
		while(s[j]<='9' && s[j]>='0')
			x=x*10+s[j]-'0',++j;
		++j;
		while(s[j]<='9' && 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;
}