#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100, MOD = 1000000207, base = 1000003;
int n, pw[N];
string str;
int add(long long a, int b) { return (a + b + 2LL * MOD) % MOD; }
int mul(long long a, int b) { return (a * b) % MOD; }
struct Node {
  int t_zero, suf, pref, hash, len;
  Node() : t_zero(0), suf(0), pref(0), hash(0), len(0) {}
  Node(int t_zero, int suf, int pref, int hash, int len)
      : t_zero(t_zero), suf(suf), pref(pref), hash(hash), len(len) {}
} node[4 * N];
Node merge(Node left, Node right) {
  Node ret;
  ret.t_zero = left.t_zero + right.t_zero;
  ret.hash = add(right.hash, mul(left.hash, pw[right.t_zero]));
  ret.len = left.len + right.len;
  if (left.suf % 2 == 1 && right.pref % 2 == 1)
    ret.hash = add(ret.hash, -mul(2, pw[right.t_zero]));
  ret.pref = left.pref;
  ret.suf = right.suf;
  if (ret.pref == left.len) ret.pref += right.pref;
  if (ret.suf == right.len) ret.suf += left.suf;
  return ret;
}
void build(int s = 0, int e = n, int id = 1) {
  if (e - s == 1) {
    if (str[s] == '0')
      node[id] = Node(1, 0, 0, 0, 1);
    else
      node[id] = Node(0, 1, 1, 1, 1);
    return;
  }
  int mid = (s + e) / 2;
  build(s, mid, 2 * id);
  build(mid, e, 2 * id + 1);
  node[id] = merge(node[2 * id], node[2 * id + 1]);
}
Node get(int l, int r, int s = 0, int e = n, int id = 1) {
  if (r <= s || e <= l) return Node();
  if (l <= s && e <= r) return node[id];
  int mid = (s + e) / 2;
  return merge(get(l, r, s, mid, 2 * id), get(l, r, mid, e, 2 * id + 1));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  pw[0] = 1;
  for (int i = 1; i < N; i++) pw[i] = mul(pw[i - 1], base);
  int q;
  cin >> n >> str >> q;
  build();
  while (q--) {
    int l1, l2, len;
    cin >> l1 >> l2 >> len;
    l1--;
    l2--;
    Node A = get(l1, l1 + len);
    Node B = get(l2, l2 + len);
    cout << (A.t_zero == B.t_zero && A.hash == B.hash ? "Yes" : "No") << "\n";
  }
}
