Cod sursa(job #2228996)

Utilizator patcasrarespatcas rares danut patcasrares Data 5 august 2018 16:56:21
Problema Lacate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include<fstream>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#define x first
#define y second
#define DN 100005
#define pb push_back
#define x first
#define y second
using namespace std;
int n,m,f,g,d,dp1[DN],dp2[DN],dp3[DN],dp4[DN],t;
int pr[DN],viz[DN],r1,r2,ma;
vector<pair<int,int> >b[DN],v[DN];
int r[DN],c[DN];
set<int >s;
void dfs(int nod)
{
    int val;
    viz[nod]=t;
    dp3[nod]=dp4[nod]=nod;
    for(auto i:v[nod])
        if(viz[i.x]!=t)
        {
            dfs(i.x);
            val=dp1[i.x]+i.y;
            if(val>dp1[nod])
            {
                dp2[nod]=dp1[nod];
                dp4[nod]=dp3[nod];
                dp1[nod]=val;
                dp3[nod]=dp3[i.x];
            }
            else
                if(val>dp2[nod])
                {
                    dp2[nod]=val;
                    dp4[nod]=dp3[i.x];
                }
        }
    if(dp1[nod]+dp2[nod]>ma)
    {
        ma=dp1[nod]+dp2[nod];
        r1=dp3[nod];
        r2=dp4[nod];
    }
}
void dfs2(int nod,int d)
{
    int f,g,l;
    c[d]=nod;
    s.insert(d);
    viz[nod]=t;
    for(auto i:b[nod])
    {
        if(i.x==0)
        {
            r[i.y]=nod;
            continue;
        }
        auto it=s.lower_bound(d-i.x);
       // cout<<nod<<' '<<i.x<<' '<<d<<' '<<d-i.x<<'\n';
        //cout<<it->y<<' '<<it->x<<'\n';
        if(d-i.x<0)
            continue;
        if(it==s.end())
            continue;
        if(*it!=d-i.x)
            continue;
        r[i.y]=c[*it];
    }
    for(auto i:v[nod])
        if(viz[i.x]!=t)
        {
            pr[i.x]=nod;
            dfs2(i.x,d+i.y);
        }
    s.erase(s.find(d));
}
int main()
{
    cin>>n>>m;
    if(n==1)
    {
        while(m--)
        {
            cin>>f>>g;
            if(g==0)
                cout<<1<<'\n';
            else
                cout<<0<<'\n';
        }
        return 0;
    }
    for(int i=1;i<n;i++)
    {
        cin>>f>>g;
        v[f].pb({g,1});
        v[g].pb({f,1});
    }
    for(int i=1;i<=m;i++)
    {
        cin>>f>>g;
        b[f].pb({g,i});
    }
    t++;
    dfs(1);
    t++;
    dfs2(r1,0);
    t++;
    dfs2(r2,0);
    for(int i=1;i<=m;i++)
        cout<<r[i]<<'\n';
}