Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define pb push_back
- using namespace std;
- const int MAXN = 1e5 + 10;
- const int INF = 1e9 + 7;
- bool was[MAXN];
- vector <int> g[MAXN];
- int up[MAXN][23];
- int tin[MAXN], tout[MAXN], Log;
- int add[8 * MAXN];
- bool upper(int a, int b){
- return (tin[a] <= tin[b] && tout[a] >= tout[b]);
- }
- int timer = 0;
- int pred[MAXN];
- void dfs(int x, int p = 0){
- was[x] = 1;
- pred[x] = p;
- tin[x] = ++timer;
- up[x][0] = p;
- for (int i = 1; i <= Log; i++){
- up[x][i] = up[up[x][i - 1]][i - 1];
- }
- for (int i = 0; i < g[x].size(); i++){
- int to = g[x][i];
- if (!was[to]){
- dfs(to, x);
- }
- }
- tout[x] = ++timer;
- }
- int lca(int a, int b){
- if (upper(a, b))
- return a;
- if (upper(b, a))
- return b;
- for (int i = Log; i >= 0; i--){
- if (!upper(up[a][i], b))
- a = up[a][i];
- }
- return up[a][0];
- }
- void push(int v){
- if (add[v] != 0){
- add[v << 1] += add[v];
- add[(v << 1) | 1] += add[v];
- add[v] = 0;
- }
- }
- void update(int v, int tl, int tr, int l, int r, int val){
- if (l > r){
- return;
- }
- if (l == tl && r == tr){
- add[v] += val;
- return;
- }
- push(v);
- int tm = (tl + tr) / 2;
- update(v << 1, tl, tm, l, min(tm, r), val);
- update((v << 1) | 1, tm + 1, tr, max(l, tm + 1), r, val);
- }
- int get(int v, int tl, int tr, int pos){
- if (tl > tr)
- return 0;
- if (tl == tr){
- return add[v];
- }
- push(v);
- int tm = (tl + tr) / 2;
- if (pos <= tm){
- return get(v << 1, tl, tm, pos);
- }
- else{
- return get((v << 1) | 1, tm + 1, tr, pos);
- }
- }
- pair <int, int> a[MAXN];
- map <pair <int, int>, int> ma;
- int main() {
- tout[0] = INF;
- int n;
- cin >> n;
- int x, y;
- for (int i = 1; i < n; i++){
- cin >> x >> y;
- g[x].pb(y);
- g[y].pb(x);
- a[i] = {x, y};
- }
- Log = 0;
- while ((1 << Log) < MAXN){
- Log++;
- }
- dfs(1);
- int m;
- cin >> m;
- for (int i = 1; i <= m; i++){
- cin >> x >> y;
- int c = lca(x, y);
- //cout << i << ' ' << c << endl;
- update(1, 1, 2 * n, tin[c] + 1, tin[x], 1);
- update(1, 1, 2 * n, tin[c] + 1, tin[y], 1);
- }
- for (int i = 1; i <= n; i++){
- int dif = get(1, 1, 2 * n, tin[i]) - get(1, 1, 2 * n, tout[i]);
- ma[{i, pred[i]}] = dif;
- ma[{pred[i], i}] = dif;
- }
- for (int i = 1; i < n; i++){
- cout << ma[a[i]] << ' ';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment