Cod sursa(job #936425)

Utilizator andreivFMI - vacaroiu andrei andreiv Data 7 aprilie 2013 00:54:32
Problema A+B Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.19 kb
#include <fstream>
#include <iostream>
#include <vector>
#define nmax 100001
using namespace std;
ifstream f("drumarb.in");
ofstream g("drumarb.out");
vector <int> v[nmax];
int n,r[18][2*nmax],e[2*nmax],k=1,viz[nmax],lg[2*nmax],p[nmax],l[nmax];
void euler(int nod, int lev)
{
    int i;
    viz[nod]=1;
    l[nod]=lev;
    p[nod]=k;
    e[k++]=nod;
    for(i=0;i<v[nod].size();i++)
    {
        if(!viz[v[nod][i]])
        {
            euler(v[nod][i],lev+1);
            e[k++]=nod;
        }
    }
}
 
void rmq()
{
    int i,j;
    lg[1]=0;
    for(i=2;i<k;i++)
        lg[i]=lg[i/2]+1;
 
    for(i=1;i<k;i++)
        r[0][i]=i;
 
    for(i=1;(1<<i)<k;i++)
    {
        for(j=1;j<k;j++)
        {
            r[i][j]=r[i-1][j];
            if(j+(1<<(i-1))<k && l[e[r[i-1][j+(1<<(i-1))]]]<l[e[r[i][j]]])
                r[i][j]=r[i-1][j+(1<<(i-1))];
        }
    }
}
int lca(int x, int y)
{
    int a,b,aux,dif,o,sol;
    a=p[x]; b=p[y];
    if(a>b) {aux=a; a=b; b=aux;}
    dif=b-a+1;
    sol=e[r[lg[dif]][a]];
    o=dif-(1<<lg[dif]);
    if( o && l[e[r[lg[dif]][a+o]]]<l[sol])
        sol=e[r[lg[dif]][a+o]];
    return sol;
}

int dist(int x,int y)
{
	return l[x]+l[y]-2*l[lca(x,y)];
}

int main()
{
    f>>n;
    int i,x,y,m;
    f>>m;
    for(i=1;i<n;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    euler(1,1);
    rmq();
    for(i=0;i<m;i++)
    {
		int ax,ay,bx,by;
        f>>ax>>ay>>bx>>by;
		int lxx=lca(ax,bx),lxy=lca(ax,by),lyx=lca(ay,bx),lyy=lca(ay,by),laa=lca(ax,ay),lbb=lca(bx,by);
		//if (lca(laa,lbb)==laa)
		if (laa==lbb)
			{g<<max(dist(lxx,lyy),dist(lxy,lyx))+1<<'\n';continue;}
			
		if (lca(ax,lbb)==lbb || lca(ay,lbb)==lbb) 
			if (lca(lbb,ax)==ax || lca(lbb,ay)==ay)
			{g<<min(dist(ay,lbb),dist(ax,lbb))<<'\n';continue;}
		if (lca(bx,laa)==laa || lca(by,laa)==laa)
			if ((lca(laa,bx)==bx || lca(laa,by)==by))
			{g<<min(dist(by,laa),dist(bx,laa))<<'\n';continue;}	
		
		if ((lca(ax,lbb)==ax) || (lca(ay,lbb)==ay) || (lca(bx,laa)==bx) || (lca(by,laa)==by))
			{g<<"0\n";continue;}		
		
		
			
		g<<max(dist(lxy,lyx),dist(lyy,lyx))<<'\n';
		ax=0;	
			
		
		
    }
}