func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( Ofast,unroll-loops )   using namespace std;   const int maxn = 15e4 + 7, blo = 255, mo = 998244353;   int n, q, cl = 0, p[maxn], sz[maxn], lb[maxn], rb[maxn];   int_fast64_t inv, one = 0, rec[maxn], dat[maxn];   vector<int> vt, g[maxn];   vector<vector<int>> hsz;   inline int qp(int_fast64_t x, int t = mo - 2) {     int_fast64_t re = 1;     while (t) {       if (t & 1) re = re * x % mo;       x = x * x % mo, t >>= 1;     }     return re;   }   inline void add(int i, int x) {     for (; i <= cl + 1; i += i & -i) {       dat[i] += x;       if (dat[i] >= mo) dat[i] -= mo;     }   }   inline int sum(int i) {     int_fast64_t re = 0;     for (; i > 0; i -= i & -i) {       re += dat[i];     }     re += one;     return re % mo;   }   void dfs(int u, int f) {     lb[u] = cl++;     sz[u] = 1;     p[u] = f;     for (register int i = (0); i < (g[u].size()); ++i) {       int& v = g[u][i];       if (v == f) continue;       dfs(v, u);       sz[u] += sz[v];     }     rb[u] = cl;   }   void gsz(int u, int f, int k) {     hsz.back()[u] = k;     for (register int i = (0); i < (g[u].size()); ++i) {       int& v = g[u][i];       if (v == f) continue;       gsz(v, u, k);     }   }   int main() {     cin.tie(0), cout.tie(0), ios_base::sync_with_stdio(false);     cin >> n >> q;     inv = qp(n);     for (register int i = (1); i < (n); ++i) {       int u, v;       cin >> u >> v, --u, --v;       g[u].emplace_back(v), g[v].emplace_back(u);     }     dfs(0, -1);     for (register int i = (0); i < (n); ++i) {       if (g[i].size() > blo) {         vt.emplace_back(i);         hsz.emplace_back(*new vector<int>);         hsz.back().reserve(n);         int s = 0;         for (register int j = (0); j < (g[i].size()); ++j) {           int& v = g[i][j];           if (v == p[i]) continue;           gsz(v, i, sz[v]);           s += sz[v];         }         if (p[i] >= 0) gsz(p[i], i, n - s - 1);         hsz.back()[i] = 0;       }     }     while (q--) {       int_fast64_t t, v, d, di;       cin >> t >> v, --v;       if (t == 1) {         cin >> d;         if (g[v].size() > blo) {           rec[v] += d;           if (rec[v] >= mo) rec[v] -= mo;         } else {           di = d * inv % mo;           for (register int i = (0); i < (g[v].size()); ++i) {             int& u = g[v][i];             int x = di * (n - sz[u]) % mo;             if (u == p[v]) continue;             add(lb[u] + 1, x);             add(rb[u] + 1, mo - x);           }           int x = di * sz[v] % mo;           one += x;           add(lb[v] + 1, d < x ? mo + d - x : d - x);           add(rb[v] + 1, x);           add(lb[v] + 2, mo - d);         }       } else {         int_fast64_t res = 0;         for (register int i = (0); i < (vt.size()); ++i) {           res += rec[vt[i]] * (n - hsz[i][v]) % mo;         }         cout << (res % mo * inv + sum(lb[v] + 1)) % mo <<   n ;       }     }   }   