fork download
  1. // ROOT : DRAGON3012009 : WA in Real Life
  2. #include <bits/stdc++.h>
  3. #define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
  4. #define FORD(i,r,l) for(int i = r ; i >= l ; i --)
  5. #define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
  6. #define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
  7. #define ll long long
  8. #define el "\n"
  9. #define fi first
  10. #define se second
  11. #define _ROOT_ int main()
  12. #define M 1000000007
  13. #define MAXN 300103
  14. #define Bit(i) (1LL << i )
  15. #define INF (1ll<<30)
  16. #define NAME "file"
  17. #define debug(a) cout << #a << " = " << a << endl;
  18. using namespace std;
  19.  
  20. ll n, m, q ;
  21. ll a[MAXN] ;
  22. ll st[MAXN], fin[MAXN ], timeDfs ;
  23. ll h[MAXN ] ;
  24. ll par[MAXN] ;
  25. vector<ll> high[MAXN ] ;
  26. vector<ll> adj[MAXN] ;
  27.  
  28. struct Seg {
  29. vector<ll> lazy, val ;
  30.  
  31. void addd(ll sz ) {
  32. lazy.resize(4 * sz , 0 ) ;
  33. val.resize(4 * sz , 0 ) ;
  34. }
  35. void fix(ll id, ll l, ll r ) {
  36. if(lazy[id] == 0 ) return ;
  37. val[id] += lazy[id] * (r - l + 1 ) ;
  38. if(l != r ) {
  39. lazy[id << 1 ] += lazy[id] ;
  40. lazy[id << 1 | 1] += lazy[id] ;
  41. }
  42. lazy[id ] = 0 ;
  43. }
  44.  
  45. void update(ll id, ll l, ll r, ll u, ll v, ll value ) {
  46. fix(id, l, r ) ;
  47. if(u > r || v < l ) return ;
  48. if(u <= l && v >= r ) {
  49. lazy[id] += value ;
  50. fix(id, l, r) ;
  51. return ;
  52. }
  53. ll m = l + r >> 1 ;
  54. update(id << 1, l, m, u, v, value ) ;
  55. update(id << 1 | 1, m + 1, r, u, v, value ) ;
  56. val[id] = val[id << 1] + val[id << 1 | 1 ] ;
  57. }
  58. ll get(ll id, ll l, ll r, ll u, ll v ) {
  59. fix(id, l, r ) ;
  60. if(u > r || v < l ) return 0 ;
  61. if(u <= l && v >= r ) return val[id] ;
  62. ll m = l + r >> 1 ;
  63. return get(id << 1, l, m, u, v ) + get(id << 1 | 1, m + 1, r, u, v ) ;
  64. }
  65. } seg[MAXN ] ;
  66.  
  67. void dfs(ll u, ll p ) {
  68. st[u] = ++ timeDfs ;
  69. for(ll v : adj[u]) if(v != p ) {
  70. par[v] = u ;
  71. h[v] = h[u] + 1;
  72. dfs(v, u ) ;
  73. }
  74. fin[u] = timeDfs ;
  75. }
  76.  
  77. void init() {
  78. cin >> n >> q ;
  79. FOR(i, 1, n ) cin >> a[i] ;
  80. FOR(i, 2, n ) {
  81. ll x, y ;
  82. cin >> x >> y ;
  83. adj[x].push_back(y) ;
  84. adj[y].push_back(x) ;
  85. }
  86. }
  87.  
  88. void solve() {
  89. dfs(1 , 1 ) ;
  90.  
  91. FOR(i, 1, n ) high[h[i]].push_back(st[i]) ;
  92. FOR(i, 0, n ) sort(high[i].begin(), high[i].end() ) ;
  93. FOR(i, 0, n + 1 ) seg[i].addd(high[i].size() + 1 ) ;
  94.  
  95. FOR(i, 1, n ) {
  96. ll L = lower_bound(high[h[i]].begin(), high[h[i]].end(), st[i]) - high[h[i]].begin() ;
  97. seg[h[i]].update(1, 0, high[h[i]].size(), L, L, a[i]) ;
  98. }
  99.  
  100. FOR(cnt, 1, q ) {
  101. ll t ;
  102. cin >> t ;
  103. if(t == 1 ) {
  104. ll u, value ;
  105. cin >> u >> value ;
  106. ll nxt_high = h[u] + 1 ;
  107.  
  108. ll L = lower_bound(high[h[u]].begin(), high[h[u]].end(), st[u]) - high[h[u]].begin() ;
  109. seg[h[u]].update(1, 0, high[h[u]].size(), L, L, 2 * value ) ;
  110.  
  111. if(par[u]) {
  112. L = lower_bound(high[h[u] - 1 ].begin(), high[h[u] - 1 ].end(), st[par[u]] ) - high[h[u] - 1 ].begin() ;
  113. seg[h[u] - 1 ].update(1, 0, high[h[u] - 1].size(), L, L, value ) ;
  114. }
  115.  
  116. L = lower_bound(high[nxt_high].begin(), high[nxt_high].end(), st[u] ) - high[nxt_high].begin() ;
  117. ll R = upper_bound(high[nxt_high].begin(), high[nxt_high].end(), fin[u] ) - high[nxt_high].begin() - 1 ;
  118. if(L > R ) continue ;
  119. seg[nxt_high].update(1, 0, high[nxt_high].size(), L, R, value ) ;
  120. } else {
  121. ll u ;
  122. cin >> u ;
  123. ll ans = 0 ;
  124. ll nxt_high = h[u] + 1 ;
  125.  
  126. ll L = lower_bound(high[h[u]].begin(), high[h[u]].end(), st[u]) - high[h[u]].begin() ;
  127. ans += seg[h[u]].get(1, 0, high[h[u]].size(), L, L ) ;
  128.  
  129. if(par[u]) {
  130. L = lower_bound(high[h[u] - 1 ].begin(), high[h[u] - 1 ].end(), st[par[u]] ) - high[h[u] - 1 ].begin() ;
  131. ans += seg[h[u] - 1 ].get(1, 0, high[h[u] - 1].size(), L, L ) ;
  132. }
  133.  
  134. L = lower_bound(high[nxt_high].begin(), high[nxt_high].end(), st[u] ) - high[nxt_high].begin() ;
  135. ll R = upper_bound(high[nxt_high].begin(), high[nxt_high].end(), fin[u] ) - high[nxt_high].begin() - 1 ;
  136. if(L <= R ) ans += seg[nxt_high].get(1, 0, high[nxt_high].size(), L, R ) ;
  137.  
  138. cout << ans << el ;
  139. }
  140. }
  141. }
  142.  
  143. _ROOT_ {
  144. // freopen(NAME".inp" , "r" , stdin);
  145. // freopen(NAME".out" , "w", stdout) ;
  146. ios_base::sync_with_stdio(0);
  147. cin.tie(0);
  148. cout.tie(0);
  149. int t = 1; // cin >> t ;
  150. while(t--) {
  151. init();
  152. solve();
  153. }
  154. return (0&0);
  155. }
  156.  
Success #stdin #stdout 0.01s 35276KB
stdin
Standard input is empty
stdout
Standard output is empty