BotByte

Untitled

Feb 28th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define MAX 100005
  7. #define MOD 1000000007
  8. ll po[MAX], lvl[MAX], st[MAX], tim = 0, par[MAX], ed[MAX];
  9. vector<ll> adj[MAX];
  10. ll val[MAX];
  11. ll tree[4*MAX];
  12.  
  13. void gen()
  14. {
  15. for(ll i=0; i<MAX; i++) adj[i].clear();
  16. memset(val, 0, sizeof val);
  17. tim = 0;
  18. memset(tree, 0, sizeof tree);
  19. }
  20.  
  21. ll bigMod(ll a, ll p)
  22. {
  23. if(p == 0) return 1;
  24. if(p == 1) return a;
  25. ll ret = bigMod(a, p/2);
  26. ret = (ret*ret)%MOD;
  27. if(p & 1) ret = (ret*a)%MOD;
  28. return ret;
  29. }
  30.  
  31. ll calc(ll p, ll x)
  32. {
  33. ll lob = p, hor = po[x];
  34. hor = bigMod(hor, MOD-2);
  35. ll ans = (lob*hor)%MOD;
  36. return ans;
  37. }
  38.  
  39.  
  40. void dfs(ll u, ll p, ll l)
  41. {
  42. lvl[u] = l;
  43. ++tim;
  44. st[u] = tim;
  45. par[u] = p;
  46. for(ll i=0; i<adj[u].size(); i++){
  47. ll v = adj[u][i];
  48. if(v != p){
  49. dfs(v, u, l-1);
  50. }
  51. }
  52. ed[u] = tim;
  53. }
  54.  
  55. void update(ll node, ll b, ll e, ll pos, ll p, ll x)
  56. {
  57. if(pos > e || pos < b) return;
  58. if(b == e && pos == b){
  59. tree[node] = calc(p, x);
  60. //cout << "HI " << p << " " << x << " " << calc(p, x) << endl;
  61. return;
  62. }
  63. ll left = 2*node;
  64. ll right = 2*node+1;
  65. ll mid = (b+e)/2;
  66. update(left, b, mid, pos, p, x);
  67. update(right, mid+1, e, pos, p, x);
  68. tree[node] = (tree[left]+tree[right])%MOD;
  69. }
  70.  
  71. ll query(ll node, ll b, ll e, ll l, ll r)
  72. {
  73. if(l > r || l > e || r < b) return 0;
  74. if(b >= l && e <= r){
  75. return tree[node];
  76. }
  77. ll left = 2*node;
  78. ll right = 2*node+1;
  79. ll mid = (b+e)/2;
  80. ll q1 = query(left, b, mid, l, r);
  81. ll q2 = query(right, mid+1, e, l, r);
  82. return (q1+q2)%MOD;
  83. }
  84.  
  85. int main()
  86. {
  87. //freopen("in.txt", "r", stdin);
  88. //freopen("out.txt", "w", stdout);
  89. po[0] = 1;
  90. for(ll i=1; i<MAX; i++) po[i] = (po[i-1]*2)%MOD;
  91. ll cases;
  92. scanf("%lld", &cases);
  93. ll caseno = 0;
  94. while(cases--){
  95. printf("Case %lld:\n", ++caseno);
  96. gen();
  97. ll n;
  98. scanf("%lld", &n);
  99. for(ll i=1; i<n; i++){
  100. ll u, v;
  101. scanf("%lld %lld", &u, &v);
  102. adj[u].push_back(v);
  103. adj[v].push_back(u);
  104. }
  105. dfs(1, -1, n);
  106. ll q;
  107. scanf("%lld", &q);
  108. while(q--){
  109. ll type;
  110. scanf("%lld", &type);
  111. if(type == 2){
  112. ll node, p;
  113. scanf("%lld %lld", &node, &p);
  114. p = (p+MOD)%MOD;
  115. val[node] += p;
  116. val[node] = val[node]%MOD;
  117. ll l = lvl[node];
  118. node = par[node];
  119. if(node != -1){
  120. update(1, 1, tim, node, p, l);
  121. }
  122. }
  123. else {
  124. ll node;
  125. scanf("%lld", &node);
  126. ll q = query(1, 1, tim, st[node], ed[node]);
  127. ll l = lvl[node];
  128. q = (q*po[l-1])%MOD;
  129. q += val[node];
  130. q = q%MOD;
  131. printf("%lld\n", q);
  132. }
  133. }
  134. }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment