func_code_string: #include <bits/stdc++.h>   using namespace std;   using ll = long long;   using ii = pair<int, int>;   const int MAXN = 5 + 300000;   const int MAXB = 21;   int n, arr[MAXN], nxt[MAXN][MAXB], memo[MAXN][MAXB];   int dp(int i, int k) {     if (i == n) return n;     int& ans = memo[i][k];     if (ans == -1) {       if (nxt[i][k] == i) {         ans = i;       } else {         ans = n;         assert((arr[i] & (1 << k)) == 0);         for (int j = 0; j < MAXB; ++j) {           if (arr[i] & (1 << j)) {             ans = min(ans, dp(nxt[1 + i][j], k));           }         }       }     }     return ans;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(nullptr);     cout.tie(nullptr);     int q;     cin >> n >> q;     memset(nxt, -1, sizeof nxt);     for (int i = (int)0; i < (int)n; ++i) {       int x;       cin >> x;       arr[i] = x;       for (int k = 0; k < MAXB; ++k) {         if (x & (1 << k)) {           nxt[i][k] = i;         }       }     }     memset(memo, -1, sizeof memo);     for (int j = 0; j < MAXB; ++j) {       nxt[n][j] = n;     }     for (int i = n - 1; i >= 0; --i) {       for (int j = 0; j < MAXB; ++j) {         if (nxt[i][j] == -1) {           nxt[i][j] = nxt[1 + i][j];         }       }     }     while (q--) {       int x, y;       cin >> x >> y;       --x;       --y;       bool ans = false;       for (int j = 0; j < MAXB; ++j) {         if ((arr[y] & (1 << j)) && dp(x, j) <= y) {           ans = true;           break;         }       }       cout << (ans ?  Shi  :  Fou ) <<   n ;     }     return 0;   }   