Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int MX = (1<<20);
- const int MXL = 20;
- int n;
- vector < pair < int , int > > E;
- int depth[MX] , par[MXL][MX];
- vector < int > v[MX];
- pair < int , int > best[MX][3];
- pair < int , int > inc(pair < int , int > a){
- return {a.first + 1 , a.second};
- }
- void Pdfs(int x , int p){
- int nxt , C , sz=v[x].size();
- best[x][0] = {0 , x};
- best[x][1] = {-1 , 0};
- best[x][2] = best[x][1];
- for(int j=0;j<sz;j++){
- nxt=v[x][j];
- if(nxt == p) continue;
- depth[nxt]=depth[x]+1;
- par[0][nxt]=x;
- Pdfs(nxt , x);
- if(inc(best[nxt][0]) > best[x][2]) best[x][2] = inc(best[nxt][0]);
- if(best[x][2] > best[x][1]) swap(best[x][2] , best[x][1]);
- if(best[x][1] > best[x][0]) swap(best[x][1] , best[x][0]);
- }
- }
- void process(){
- for(int j=1;j<MXL;j++)
- for(int i=1;i<=n;i++)
- par[j][i]=par[j-1][par[j-1][i]];
- }
- int Kth(int x , int K){
- int node=x;
- for(int j=0;j<MXL;j++)
- if((K&(1<<j)))
- node=par[j][node];
- return node;
- }
- int LCA(int x , int y){
- if(depth[x] < depth[y]) swap(x , y);
- x = Kth(x , depth[x] - depth[y]);
- if(x == y) return x;
- for(int j = MXL - 1 ; j >= 0 ; j--)
- if(par[j][x] != 0 && par[j][y] != 0 && par[j][x] != par[j][y])
- x = par[j][x] , y = par[j][y];
- return par[0][x];
- }
- int DIS(int x , int y){
- return depth[x] + depth[y] - 2 * depth[LCA(x , y)];
- }
- int main() {
- T = readT; //read T here
- while(T--){
- n = readn(); // read n here
- QN = readQN(); //read QN here
- for(int j = 0 ; j < MXL ; j++)
- for(int i = 1 ; i <= n ; i++)
- par[j][i] = 0;
- for(int j = 1 ; j <= n ; j++)
- v[j].clear();
- for(int j = 1 ; j < n ; j++){
- int a = read(); //read a
- int b = readb(); //read b
- v[a].push_back(b);
- v[b].push_back(a);
- }
- depth[1] = 1;
- Pdfs(1 , -1);
- process();
- for(int j = 1 ; j <= QN ; j++){
- int a = reada();
- int da = readda();
- int b = readb();
- int db = readdb();
- int x = readanswer();
- assert(dis(x , a) == da && dis(x , b) == db);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement