Pagini recente » Cod sursa (job #989012) | Cod sursa (job #114875) | Cod sursa (job #532573) | Cod sursa (job #2390005) | Cod sursa (job #2228996)
#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';
}