Tranvick

Untitled

Dec 26th, 2011
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <cstdio>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <vector>
  9. #include <set>
  10. #include <stack>
  11. #include <map>
  12. #include <queue>
  13. #include <string>
  14. #include <memory.h>
  15. #include <iterator>
  16. #define ll long long
  17. #define ull unsigned long long
  18. #define ul unsigned long
  19. #define ld double
  20. #define lld long double
  21. #define mem(A,X) memset(A,X,sizeof(A))
  22. #define memo(A) memset(A,0,sizeof(A))
  23. #define forn(I,B) for (int I=1;I<=(B);I++)
  24. #define forg(H,V) for (int H=first[V];H;H=nex[H])
  25. #define rep(I,B) for (int I=0;I<(B);I++)
  26. #define labs(X) (((X)>0)?(X):(-(X)))
  27. #define ropen(X) freopen(X,"r",stdin)
  28. #define wopen(X) freopen(X,"w",stdout)
  29. #define vi vector<int>
  30. #define pii pair<int,int>
  31. #define pll pair<long long,long long>
  32. #define pb push_back
  33. #define mp make_pair
  34. #define all(X) (X).begin(),(X).end()
  35. #define M 400010
  36. #define N 200010
  37. #define INF 1111111111
  38.  
  39. using namespace std;
  40.  
  41. int es[M],first[N],nex[M],c,n,m,d1,d2,d[3][N],longest[N],l,up[N][18],down[N][18];
  42. bool b[N];
  43.  
  44. inline void add(int x,int y){
  45.     nex[++c]=first[x];first[x]=c;
  46.     es[c]=y;swap(x,y);
  47.     nex[++c]=first[x];first[x]=c;
  48.     es[c]=y;
  49. }
  50.  
  51. void input(){
  52. //  ropen("input.txt");
  53.     scanf("%d%d",&n,&m);
  54.     forn(i,n-1){
  55.         int x,y;
  56.         scanf("%d%d",&x,&y);
  57.         add(x,y);
  58.     }
  59.     while ((1<<l)<=n) ++l;--l;
  60. }
  61.  
  62. void dfs(int v=1){
  63.     forg(h,v) if (d[0][es[h]]>d[0][v]+1){
  64.         d[0][es[h]]=d[0][v]+1;
  65.         dfs(es[h]);
  66.     }
  67. }
  68.  
  69. void get_diametr(){
  70.     mem(d,63);d[0][1]=d[0][0]=0;
  71.     dfs();
  72.     int u=0;
  73.     forn(i,n) if (d[0][i]>d[0][u]) u=i;
  74.     mem(d,63);d[0][u]=d[0][0]=0;
  75.     d1=u;dfs(u);u=0;
  76.     forn(i,n) if (d[0][i]>d[0][u]) u=i;
  77.     d2=u;
  78. }
  79.  
  80. void dfs_d(int v,int t){
  81.     forg(h,v) if (d[t][es[h]]>d[t][v]+1){
  82.         d[t][es[h]]=d[t][v]+1;
  83.         dfs_d(es[h],t);
  84.     }
  85. }  
  86.  
  87. void calc_dists(){
  88.     mem(d,63);
  89.     d[1][d1]=d[2][d2]=0;
  90.     dfs_d(d1,1);
  91.     dfs_d(d2,2);
  92.     forn(i,n) longest[i]=d[1][i]>d[2][i]?d1:d2;
  93. }
  94.  
  95. void dfs_up(int v=d1,int p=0){
  96.     b[v]=1;
  97.     up[v][0]=p;
  98.     forn(i,l) up[v][i]=up[up[v][i-1]][i-1];
  99.     forg(h,v) if (!b[es[h]]) dfs_up(es[h],v);
  100. }
  101.  
  102. void dfs_down(int v=d2,int p=0){
  103.     b[v]=1;
  104.     down[v][0]=p;
  105.     forn(i,l) down[v][i]=down[down[v][i-1]][i-1];
  106.     forg(h,v) if (!b[es[h]]) dfs_down(es[h],v);
  107. }
  108.  
  109. inline void answer(int v,int dist){
  110.     bool boo=longest[v]==d1;
  111.     for (int i=l;i>=0;i--)
  112.         if ((1<<i)<=dist){
  113.             dist-=1<<i;
  114.             v=boo?up[v][i]:down[v][i];
  115.         }
  116.     printf("%d\n",v);
  117. }              
  118.  
  119. int main(){
  120.     input();
  121.     get_diametr();
  122.     calc_dists();
  123.     dfs_up();memo(b);
  124.     dfs_down();
  125.     forn(i,m){
  126.         int x,y;
  127.         scanf("%d%d",&x,&y);
  128.         answer(x,y);
  129.     }
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment