func_code_string: #include <bits/stdc++.h>   constexpr int N = 1.5e5, M = 1 << 18;   int n, q;   int parent[N], dep[N];   char ch[N];   int down[N], h[N], deg[N];   int mx[N][26], edge[N][26], sum[N];   int e[N][2];   int bad;   void add(int u, int c, int v) {     u = down[u];     edge[u][c] += v;     for (u = parent[u]; u != -1; u = parent[u]) {       bad -= sum[u] > h[u];       sum[u] -= mx[u][c];       mx[u][c] = 0;       for (int i = 0; i < deg[u]; ++i)         mx[u][c] = std::max(mx[u][c], mx[e[u][i]][c] + edge[e[u][i]][c]);       sum[u] += mx[u][c];       bad += sum[u] > h[u];     }   }   int main() {     std::ios::sync_with_stdio(false);     std::cin.tie(nullptr);     std::cin >> n >> q;     parent[0] = -1;     for (int i = 1; i < n; ++i) {       std::cin >> parent[i] >> ch[i];       --parent[i];       e[parent[i]][deg[parent[i]]++] = i;     }     for (int i = n - 1; i > 0; --i) h[parent[i]] = h[i] + 1;     for (int i = 1; i < n; ++i) {       if (h[parent[i]] != h[i] + 1) {         while (q--) std::cout <<  Fou n ;         return 0;       }       if (parent[i] != 0 && deg[parent[i]] == 1) parent[i] = parent[parent[i]];     }     for (int i = n - 1; i > 0; --i) down[i] = deg[i] == 1 ? down[e[i][0]] : i;     for (int i = 0; i < n; ++i) deg[i] = 0;     for (int i = 1; i < n; ++i)       if (down[i] == i) e[parent[i]][deg[parent[i]]++] = i;     for (int i = 1; i < n; ++i)       if (ch[i] !=  ? ) add(i, ch[i] -  a , 1);     while (q--) {       int v;       char c;       std::cin >> v >> c;       --v;       if (ch[v] !=  ? ) add(v, ch[v] -  a , -1);       if (c !=  ? ) add(v, c -  a , 1);       ch[v] = c;       if (bad == 0) {         int ans = 0;         for (int i = 0; i < 26; ++i) ans += (i + 1) * (h[0] - sum[0] + mx[0][i]);         std::cout <<  Shi   << ans <<   n ;       } else {         std::cout <<  Fou n ;       }     }     return 0;   }   