#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
const int hashnum = 1;
long long base[] = {233, 23, 97};
long long mod[] = {122420729, 1000000007, 1000000009};
int sum[maxn];
char s[maxn];
long long power[hashnum][maxn];
int n;
struct node {
  long long hv[hashnum];
  int pref, suf, len;
};
node zer;
inline void init() {
  zer.pref = zer.suf = zer.len = 0;
  for (int i = (0); i < (hashnum); ++i) zer.hv[i] = 0;
  for (int i = (0); i < (hashnum); ++i) {
    power[i][0] = 1;
    for (int j = (1); j < (maxn); ++j)
      power[i][j] = power[i][j - 1] * base[i] % mod[i];
  }
}
node merge(node& a, node& b) {
  node c = zer;
  if (a.len == 0 && b.len == 0)
    c.suf = c.pref = a.pref + b.pref;
  else if (a.len == 0)
    c = b, c.pref += a.pref;
  else if (b.len == 0)
    c = a, c.suf += b.pref;
  else {
    c.len = a.len + b.len + (a.suf + b.pref) % 2;
    c.pref = a.pref;
    c.suf = b.suf;
    for (int i = (0); i < (hashnum); ++i) {
      if ((a.suf + b.pref) % 2 == 1) {
        c.hv[i] = a.hv[i] * power[i][b.len + 1] % mod[i];
        (c.hv[i] += 2 * power[i][b.len] % mod[i]) %= mod[i];
        (c.hv[i] += b.hv[i]) %= mod[i];
      } else {
        c.hv[i] = a.hv[i] * power[i][b.len] % mod[i];
        (c.hv[i] += b.hv[i]) %= mod[i];
      }
    }
  }
  return c;
}
struct segtree {
  node t[maxn << 2];
  int n, ql, qr;
  node ans;
  void init(int n) { this->n = n; }
  void maintain(int o) { t[o] = merge(t[o << 1], t[o << 1 | 1]); }
  void build(int l, int r, int o) {
    t[o] = zer;
    if (l == r) {
      if (s[l] == '0') {
        t[o].len++;
        for (int i = (0); i < (hashnum); ++i) t[o].hv[i] = 1;
      } else
        t[o].suf = t[o].pref = 1;
      return;
    }
    int mid = l + r >> 1;
    build(l, mid, o << 1), build(mid + 1, r, o << 1 | 1);
    maintain(o);
  }
  void query(int l, int r, int o) {
    if (ql <= l && qr >= r)
      ans = merge(ans, t[o]);
    else {
      int mid = l + r >> 1;
      if (ql <= mid) query(l, mid, o << 1);
      if (qr > mid) query(mid + 1, r, o << 1 | 1);
    }
  }
  node Query(int l, int r) {
    ans = zer;
    ql = l, qr = r;
    query(1, n, 1);
    return ans;
  }
};
segtree tree;
bool judge(node& a, node& b) {
  if (a.suf % 2 != b.suf % 2 || a.pref % 2 != b.pref % 2 || a.len != b.len)
    return false;
  for (int i = (0); i < (hashnum); ++i)
    if (a.hv[i] != b.hv[i]) return false;
  return true;
}
int main(void) {
  scanf("%d%s", &n, s + 1);
  init();
  tree.init(n);
  tree.build(1, n, 1);
  for (int i = (1); i <= (n); ++i) {
    sum[i] = sum[i - 1];
    if (s[i] == '1') sum[i]++;
  }
  int q;
  scanf("%d", &(q));
  for (; q--;) {
    int l1, l2, r1, r2, len;
    scanf("%d%d%d", &l1, &l2, &len);
    r1 = l1 + len - 1;
    r2 = l2 + len - 1;
    if (sum[r2] - sum[l2 - 1] != sum[r1] - sum[l1 - 1]) {
      puts("No");
      continue;
    }
    node x = tree.Query(l1, r1);
    node y = tree.Query(l2, r2);
    if (judge(x, y))
      puts("Yes");
    else
      puts("No");
  }
  return 0;
}
