atulshanbhag

100589A.cpp

Sep 16th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define NMAX 100006
  3. #define TMAX 400030
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7.  
  8. ll n, m;
  9. ll nodes[NMAX], par[NMAX], depth[NMAX];
  10. ll height[NMAX];
  11. vector<ll> adj[NMAX];
  12. ll seg[TMAX];
  13.  
  14. ll get_mid(ll x, ll y) {
  15.     return x + (y - x) / 2;
  16. }
  17.  
  18. void update(ll node, ll start, ll end, ll x, ll val) {
  19.     if(start > end || start > x || end < x)
  20.         return ;
  21.     if(start == end) {
  22.         seg[node] += val;
  23.         return ;
  24.     }
  25.     ll mid = get_mid(start, end);
  26.     if(x <= mid)
  27.         update(2*node, start, mid, x, val);
  28.     else
  29.         update(2*node+1, mid+1, end, x, val);
  30.     seg[node] = seg[2*node] + seg[2*node+1];
  31. }
  32.  
  33. ll query(ll node, ll start, ll end, ll left, ll right) {
  34.     if(start > end || start > right || end < left)
  35.         return 0;
  36.     if(left <= start && end <= right)
  37.         return seg[node];
  38.     ll mid = get_mid(start, end);
  39.     return query(2*node, start, mid, left, right) +
  40.             query(2*node+1, mid+1, end, left, right);
  41. }
  42.  
  43. void bfs(ll u) {
  44.     queue< pair<ll,ll> > qu;
  45.     qu.push(make_pair(u, 0));
  46.     while(!qu.empty()) {
  47.         ll v = qu.front().first;
  48.         ll ht = qu.front().second;
  49.         qu.pop();
  50.         nodes[ht] = adj[par[v]].size();
  51.         depth[v] = ht;
  52.         for(ll w : adj[v])
  53.             qu.push(make_pair(w, ht+1));
  54.     }
  55. }
  56.  
  57. ll dfs(ll u) {
  58.     if(adj[u].size() == 0) {
  59.         height[u] = 0;
  60.         return 0;
  61.     }
  62.     for(ll v : adj[u])
  63.         height[u] = max(height[u], 1LL + dfs(v));
  64.     return height[u];
  65. }
  66.  
  67. int main() {
  68.     ios::sync_with_stdio(false);
  69.     cin >> n >> m;
  70.     for(ll i = 0; i < n-1; i++) {
  71.         ll u, v;
  72.         cin >> u >> v;
  73.         adj[u].push_back(v);
  74.         par[v] = u;
  75.     }
  76.     par[1] = 0;
  77.     adj[0].push_back(1);
  78.     memset(seg, 0, sizeof(seg));
  79.     memset(nodes, 0, sizeof(nodes));
  80.     bfs(1);
  81.     dfs(1);
  82.     while(m--) {
  83.         ll x, y;
  84.         cin >> x >> y;
  85.         if(x == 1) {
  86.             ll z;
  87.             cin >> z;
  88.             update(1, 0, n-1, y, nodes[y]*z);
  89.         }
  90.         else
  91.             cout << query(1, 0, n-1, depth[y], depth[y]) / nodes[depth[y]] +
  92.                     query(1, 0, n-1, depth[y]+1, depth[y]+height[y]) << endl;
  93.     }
  94.     return 0;
  95. }
Add Comment
Please, Sign In to add comment