Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- #define pb push_back
- using namespace std;
- const int N = 2e5 + 10;
- vector<int> gr[N];
- int p[19][N], timer, tin[N], tout[N],n, q, d[N];
- void dfs(int v, int pr, int ds = 0) {
- tin[v] = timer++;
- p[0][v] = pr;
- d[v] = ds;
- for(int i = 1; i <= 19; i++) {
- p[i][v] = p[i - 1][p[i - 1][v]];
- }
- for(auto it: gr[v]) {
- if(it != pr) dfs(it, v, ds + 1);
- }
- tout[v] = timer;
- }
- bool upper(int a, int b) {
- return tin[a] <= tin[b] && tout[a] >= tout[b];
- }
- int lca(int a, int b) {
- if(upper(a, b)) return a;
- if(upper(b, a)) return b;
- for(int i = 19; i >= 0; i--) {
- if(!upper(p[i][a], b)) {
- a = p[i][a];
- }
- }
- return p[0][a];
- }
- int len(int a, int b) {
- return d[a] + d[b] - 2 * d[lca(a, b)];
- }
- main() {
- cin >> n >> q;
- for(int i = 1; i < n; i++) {
- int l, r;
- cin >> l >> r;
- gr[l].pb(r);
- gr[r].pb(l);
- }
- dfs(1, 1);
- while(q--) {
- int l, r;
- cin >> l >> r;
- int dist = len(l, r) + 1;
- cout << dist * (dist + 1) / 2 + n - dist << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement