Guest User

a.cpp

a guest
Jan 14th, 2026
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define pb push_back
  4. using namespace std;
  5. const int MAXN = 1e5 + 10;
  6. const int INF = 1e9 + 7;
  7. bool was[MAXN];
  8. vector <int> g[MAXN];
  9. int up[MAXN][23];
  10. int tin[MAXN], tout[MAXN], Log;
  11. int add[8 * MAXN];
  12. bool upper(int a, int b){
  13.     return (tin[a] <= tin[b] && tout[a] >= tout[b]);
  14. }
  15.  
  16. int timer = 0;
  17. int pred[MAXN];
  18. void dfs(int x, int p = 0){
  19.     was[x] = 1;
  20.     pred[x] = p;
  21.     tin[x] = ++timer;
  22.     up[x][0] = p;
  23.     for (int i = 1; i <= Log; i++){
  24.         up[x][i] = up[up[x][i - 1]][i - 1];
  25.     }
  26.  
  27.     for (int i = 0; i < g[x].size(); i++){
  28.         int to = g[x][i];
  29.         if (!was[to]){
  30.             dfs(to, x);
  31.         }
  32.     }
  33.     tout[x] = ++timer;
  34. }
  35.  
  36. int lca(int a, int b){
  37.     if (upper(a, b))
  38.         return a;
  39.     if (upper(b, a))
  40.         return b;
  41.  
  42.     for (int i = Log; i >= 0; i--){
  43.         if (!upper(up[a][i], b))
  44.             a = up[a][i];
  45.     }
  46.  
  47.     return up[a][0];
  48. }
  49.  
  50.  
  51. void push(int v){
  52.     if (add[v] != 0){
  53.         add[v << 1] += add[v];
  54.         add[(v << 1) | 1] += add[v];
  55.         add[v] = 0;
  56.     }
  57. }
  58. void update(int v, int tl, int tr, int l, int r, int val){
  59.     if (l > r){
  60.         return;
  61.     }
  62.     if (l == tl && r == tr){
  63.         add[v] += val;
  64.         return;
  65.     }
  66.     push(v);
  67.     int tm = (tl + tr) / 2;
  68.     update(v << 1, tl, tm, l, min(tm, r), val);
  69.     update((v << 1) | 1, tm + 1, tr, max(l, tm + 1), r, val);
  70. }
  71.  
  72. int get(int v, int tl, int tr, int pos){
  73.     if (tl > tr)
  74.         return 0;
  75.     if (tl == tr){
  76.         return add[v];
  77.     }
  78.     push(v);
  79.     int tm = (tl + tr) / 2;
  80.     if (pos <= tm){
  81.         return get(v << 1, tl, tm, pos);
  82.     }
  83.     else{
  84.         return get((v << 1) | 1, tm + 1, tr, pos);
  85.     }
  86.  
  87. }
  88. pair <int, int> a[MAXN];
  89. map <pair <int, int>, int> ma;
  90. int main() {
  91.     tout[0] = INF;
  92.  
  93.     int n;
  94.     cin >> n;
  95.     int x, y;
  96.  
  97.     for (int i = 1; i < n; i++){
  98.         cin >> x >> y;
  99.         g[x].pb(y);
  100.         g[y].pb(x);
  101.         a[i] = {x, y};
  102.     }
  103.     Log = 0;
  104.     while ((1 << Log) < MAXN){
  105.         Log++;
  106.     }
  107.  
  108.     dfs(1);
  109.  
  110.     int m;
  111.     cin >> m;
  112.  
  113.     for (int i = 1; i <= m; i++){
  114.         cin >> x >> y;
  115.         int c = lca(x, y);
  116.         //cout << i << ' ' << c << endl;
  117.  
  118.         update(1, 1, 2 * n, tin[c] + 1, tin[x], 1);
  119.         update(1, 1, 2 * n, tin[c] + 1, tin[y], 1);
  120.     }
  121.  
  122.     for (int i = 1; i <= n; i++){
  123.         int dif = get(1, 1, 2 * n, tin[i]) - get(1, 1, 2 * n, tout[i]);
  124.         ma[{i, pred[i]}] = dif;
  125.         ma[{pred[i], i}] = dif;
  126.     }
  127.  
  128.     for (int i = 1; i < n; i++){
  129.         cout << ma[a[i]] << ' ';
  130.     }
  131.  
  132.  
  133.     return 0;
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment