Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- using namespace std;
- typedef long long ll;
- const int MAXN = 30005;
- int n, k, q;
- vector <int> graph[MAXN];
- int root, parent[MAXN], dr[MAXN][22][22], uc[MAXN], u;
- int a[MAXN], b[MAXN], path[MAXN], k0, k1, k2;
- void dfs(int v)
- {
- int sz = graph[v].size();
- for(int i = 0; i < sz; i++)
- {
- int to = graph[v][i];
- if(to != parent[v])
- {
- parent[to] = v;
- dfs(to);
- }
- }
- }
- void read_input()
- {
- scanf("%d", &n);
- int v, w;
- for(ll i = 0; i < n - 1; i++)
- {
- scanf("%d %d", &v, &w);
- graph[v].push_back(w);
- graph[w].push_back(v);
- }
- root = 1;
- for(int i = 2; i <= n; i++)
- {
- if(graph[root].size() < graph[i].size())
- {
- root = i;
- }
- }
- }
- void LCA(int v, int w)
- {
- u++;
- int lca, v1 = v, w1 = w;
- k0 = 0, k1 = 0, k2 = 0;
- for(;;)
- {
- if(v1 != root)
- {
- a[k0++] = v1;
- if(uc[v1] == u)
- {
- lca = v1;
- break;
- }
- uc[v1] = u;
- v1 = parent[v1];
- }
- if(w1 != root)
- {
- b[k1++] = w1;
- if(uc[w1] == u)
- {
- lca = w1;
- break;
- }
- uc[w1] = u;
- w1 = parent[w1];
- }
- if(v1 == w1)
- {
- a[k0++] = v1;
- b[k1++] = w1;
- lca = v1;
- break;
- }
- }
- int sz = k0;
- for(int i = 0; i < sz; i++)
- {
- if(a[i] == lca)
- {
- break;
- }
- path[k2++] = a[i];
- }
- path[k2++] = lca;
- sz = k1;
- int temp = 0;
- for(ll i = 0; i < sz; i++)
- {
- //printf("%d\n", b[i]);
- if(b[i] == lca)
- {
- temp = i - 1;
- break;
- }
- }
- for(int i = temp; i >= 0; i--)
- {
- path[k2++] = b[i];
- }
- }
- void manage_traffikant(int v, int w, int value)
- {
- LCA(v, w);
- int sz = k2, temp;
- int timer = 0, chetnost = sz + 1;
- for(int i = 0; i < sz; i++)
- {
- temp = path[i];
- dr[temp][timer][chetnost] += value;
- timer++;
- }
- dr[v][sz][chetnost] += value;
- }
- ll ans_query(int v, int w, ll t1, ll t2)
- {
- LCA(v, w);
- int sz = k2, temp;
- ll ans = 0, calc = 0, tempSum = 0, modulo = 0;
- ll c_node = 0;
- for(int i = 0; i < sz; i++)
- {
- temp = path[i];
- //printf("%d\n",temp);
- c_node = 0;
- for(ll j = 0; j <= 21; j++)
- {
- for(ll z = 1; z <= 21; z++)
- {
- //printf("%d %d %d\n", temp, j, z);
- if(j >= t1 && j <= t2)
- {
- calc = t2 - j;
- tempSum = 1;
- if(calc > 0)
- {
- tempSum += calc / z;
- }
- ans += tempSum * dr[temp][j][z];
- c_node += tempSum * dr[temp][j][z];
- //printf("%d %d %d %d\n", temp, j, z, dr[temp][j][z]);
- }
- else if(j <= t2)
- {
- modulo = (z - (t1 % z)) + t1;
- tempSum = 1;
- calc = t2 - modulo;
- if(calc < 0) continue;
- tempSum += calc / z;
- ans += tempSum * dr[temp][j][z];
- c_node += tempSum * dr[temp][j][z];
- }
- }
- }
- printf("%d %lld\n", temp, c_node);
- }
- return ans;
- }
- void query()
- {
- scanf("%d", &q);
- int type, v, w;
- ll t1, t2;
- for(int i = 0; i < q; i++)
- {
- scanf("%d %d %d", &type, &v, &w);
- if(type == 1)
- {
- manage_traffikant(v, w, 1);
- }
- else if(type == 2)
- {
- manage_traffikant(v, w, -1);
- }
- else
- {
- scanf("%lld %lld", &t1, &t2);
- //printf("DAS");
- printf("%lld\n", ans_query(v, w, t1, t2));
- }
- }
- }
- void add_traffikants()
- {
- scanf("%d", &k);
- int v, w;
- for(int i = 0; i < k; i++)
- {
- scanf("%d %d", &v, &w);
- manage_traffikant(v, w, 1);
- }
- }
- int main()
- {
- read_input();
- parent[root] = root;
- dfs(root);
- for(int i = 0; i < k2; i++)
- {
- printf("%d\n", path[i]);
- }
- add_traffikants();
- query();
- return 0;
- }
- /*
- 5
- 1 2
- 2 3
- 2 4
- 1 5
- 1
- 4 1
- 3
- 3 3 5 0 3
- 1 2 5
- 3 4 5 1 5
- */
- /*
- 6
- 1 2
- 1 3
- 2 4
- 4 5
- 4 6
- 3
- 5 4
- 6 4
- 4 3
- 5
- 3 5 3 6 10
- */
- /*
- 50
- 46 20
- 36 13
- 1 35
- 7 39
- 40 47
- 13 6
- 26 17
- 47 18
- 34 42
- 42 36
- 19 16
- 17 19
- 30 48
- 32 11
- 6 7
- 4 46
- 48 44
- 10 4
- 37 43
- 23 41
- 33 28
- 22 38
- 44 45
- 28 3
- 20 33
- 21 49
- 25 32
- 8 31
- 39 26
- 18 30
- 24 10
- 45 1
- 41 8
- 15 25
- 27 40
- 31 5
- 3 50
- 14 37
- 9 15
- 16 21
- 43 22
- 49 14
- 35 9
- 12 29
- 50 34
- 5 24
- 38 2
- 29 23
- 11 12
- 50
- 41 24
- 50 22
- 3 37
- 35 41
- 39 22
- 28 28
- 28 13
- 20 26
- 29 23
- 44 46
- 1 33
- 41 44
- 4 26
- 26 38
- 38 37
- 33 4
- 5 48
- 27 1
- 19 20
- 49 19
- 34 11
- 23 5
- 7 37
- 21 21
- 44 46
- 1 20
- 5 23
- 16 24
- 12 44
- 40 44
- 48 5
- 6 42
- 26 22
- 9 24
- 14 17
- 41 48
- 8 48
- 31 23
- 15 48
- 41 35
- 24 25
- 40 18
- 46 15
- 13 42
- 35 31
- 37 6
- 50 50
- 12 42
- 47 47
- 41 23
- 50
- 3 43 44 5 8
- 1 29 41
- 3 38 47 7 9
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement