func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long MAX = 150004;   const long long mod = 998244353;   struct edge {     long long next, to;   } h[MAX << 1];   long long head[MAX], cnt, cnt_dfsn;   long long n, q, ans, inv;   inline void add(long long x, long long y) {     h[++cnt] = edge{head[x], y};     head[x] = cnt;     h[++cnt] = edge{head[y], x};     head[y] = cnt;   }   long long dfsn[MAX], size[MAX], son[MAX], fa[MAX], top[MAX], w[MAX];   long long tree[MAX];   inline long long lowbit(long long x) { return x & (-x); }   inline void ad(long long x, long long y) {     y %= mod;     for (long long i = x; i <= n; i += lowbit(i)) tree[i] = (tree[i] + y) % mod;   }   inline long long sum(long long x) {     long long ret = 0;     for (long long i = x; i; i -= lowbit(i)) ret = (ret + tree[i]) % mod;     return ret;   }   inline long long quick(long long x, long long y) {     long long ret = 1ll;     while (y) {       if (y & 1) ret = (ret * x) % mod;       y >>= 1;       x = (x * x) % mod;     }     return ret;   }   void dfs1(long long now, long long father) {     fa[now] = father;     size[now] = 1;     for (long long i = head[now]; i; i = h[i].next) {       long long aim = h[i].to;       if (aim != father) {         dfs1(aim, now);         size[now] += size[aim];         if (size[aim] > size[son[now]]) son[now] = aim;       }     }   }   void dfs2(long long now, long long start) {     top[now] = start;     dfsn[now] = ++cnt_dfsn;     if (son[now]) dfs2(son[now], start);     for (long long i = head[now]; i; i = h[i].next) {       long long aim = h[i].to;       if (aim != fa[now] && aim != son[now]) {         dfs2(aim, aim);       }     }   }   signed main() {     scanf( %lld %lld , &n, &q);     inv = quick(n, mod - 2);     for (long long x, y, i = 1; i < n; i++) scanf( %lld %lld , &x, &y), add(x, y);     dfs1(1, 1), dfs2(1, 1);     fa[1] = 0;     for (long long op, x, y, i = 1; i <= q; i++) {       scanf( %lld , &op);       if (op == 1) {         scanf( %lld %lld , &x, &y);         w[x] = (w[x] + y) % mod;         ad(1, size[x] * y % mod);         ad(dfsn[x], (mod - size[x] * y % mod) % mod),             ad(dfsn[x] + size[x], size[x] * y % mod);         if (son[x])           ad(dfsn[son[x]], (n - size[son[x]]) * y % mod),               ad(dfsn[son[x]] + size[son[x]], mod - (n - size[son[x]]) * y % mod);       } else {         scanf( %lld , &x);         ans = (sum(dfsn[x]) + n * w[x] % mod) % mod;         for (long long j = top[x]; fa[j]; j = top[fa[j]])           ans = (ans + (n - size[j]) * w[fa[j]] % mod) % mod;         printf( %lld n , (ans * inv) % mod);       }     }     return 0;   }   