#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;
}
