Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <cstdlib>
- #include <ctime>
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <stack>
- #include <map>
- #include <queue>
- #include <string>
- #include <memory.h>
- #include <iterator>
- #define ll long long
- #define ull unsigned long long
- #define ul unsigned long
- #define ld double
- #define lld long double
- #define mem(A,X) memset(A,X,sizeof(A))
- #define memo(A) memset(A,0,sizeof(A))
- #define forn(I,B) for (int I=1;I<=(B);I++)
- #define forg(H,V) for (int H=first[V];H;H=nex[H])
- #define rep(I,B) for (int I=0;I<(B);I++)
- #define labs(X) (((X)>0)?(X):(-(X)))
- #define ropen(X) freopen(X,"r",stdin)
- #define wopen(X) freopen(X,"w",stdout)
- #define vi vector<int>
- #define pii pair<int,int>
- #define pll pair<long long,long long>
- #define pb push_back
- #define mp make_pair
- #define all(X) (X).begin(),(X).end()
- #define M 400010
- #define N 200010
- #define INF 1111111111
- using namespace std;
- int es[M],first[N],nex[M],c,n,m,d1,d2,d[3][N],longest[N],l,up[N][18],down[N][18];
- bool b[N];
- inline void add(int x,int y){
- nex[++c]=first[x];first[x]=c;
- es[c]=y;swap(x,y);
- nex[++c]=first[x];first[x]=c;
- es[c]=y;
- }
- void input(){
- // ropen("input.txt");
- scanf("%d%d",&n,&m);
- forn(i,n-1){
- int x,y;
- scanf("%d%d",&x,&y);
- add(x,y);
- }
- while ((1<<l)<=n) ++l;--l;
- }
- void dfs(int v=1){
- forg(h,v) if (d[0][es[h]]>d[0][v]+1){
- d[0][es[h]]=d[0][v]+1;
- dfs(es[h]);
- }
- }
- void get_diametr(){
- mem(d,63);d[0][1]=d[0][0]=0;
- dfs();
- int u=0;
- forn(i,n) if (d[0][i]>d[0][u]) u=i;
- mem(d,63);d[0][u]=d[0][0]=0;
- d1=u;dfs(u);u=0;
- forn(i,n) if (d[0][i]>d[0][u]) u=i;
- d2=u;
- }
- void dfs_d(int v,int t){
- forg(h,v) if (d[t][es[h]]>d[t][v]+1){
- d[t][es[h]]=d[t][v]+1;
- dfs_d(es[h],t);
- }
- }
- void calc_dists(){
- mem(d,63);
- d[1][d1]=d[2][d2]=0;
- dfs_d(d1,1);
- dfs_d(d2,2);
- forn(i,n) longest[i]=d[1][i]>d[2][i]?d1:d2;
- }
- void dfs_up(int v=d1,int p=0){
- b[v]=1;
- up[v][0]=p;
- forn(i,l) up[v][i]=up[up[v][i-1]][i-1];
- forg(h,v) if (!b[es[h]]) dfs_up(es[h],v);
- }
- void dfs_down(int v=d2,int p=0){
- b[v]=1;
- down[v][0]=p;
- forn(i,l) down[v][i]=down[down[v][i-1]][i-1];
- forg(h,v) if (!b[es[h]]) dfs_down(es[h],v);
- }
- inline void answer(int v,int dist){
- bool boo=longest[v]==d1;
- for (int i=l;i>=0;i--)
- if ((1<<i)<=dist){
- dist-=1<<i;
- v=boo?up[v][i]:down[v][i];
- }
- printf("%d\n",v);
- }
- int main(){
- input();
- get_diametr();
- calc_dists();
- dfs_up();memo(b);
- dfs_down();
- forn(i,m){
- int x,y;
- scanf("%d%d",&x,&y);
- answer(x,y);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment