#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
;
const int maxn = 800010;
unsigned long long powmod(unsigned long long n, unsigned long long k) {
  unsigned long long ret = 1;
  while (k) {
    if (k & 1) ret = ret * n % mod;
    n = n * n % mod;
    k >>= 1;
  }
  return ret;
}
int lft[maxn], rht[maxn];
unsigned long long mi[maxn][2];
unsigned long long mods[2];
char str[maxn];
struct Hash {
  Hash() {
    memset(val, 0, sizeof(val));
    cnt = 0;
  }
  void merge(const Hash& lc, const Hash& rc) {
    cnt = lc.cnt + rc.cnt;
    for (int i = 0; i < 2; i++)
      for (int j = 0; j < 2; j++) {
        if (rc.cnt == 0)
          val[i][j] = lc.val[i][j];
        else
          val[i][j] =
              (lc.val[i][j] * mi[rc.cnt][i] % mods[i] + rc.val[i][j]) % mods[i];
      }
  }
  unsigned long long val[2][2];
  int cnt;
};
Hash hhash[maxn];
void build(int n, int l, int r) {
  lft[n] = l, rht[n] = r;
  if (l == r) {
    if (str[l - 1] == '0') {
      for (int i = 0; i < 2; i++) {
        hhash[n].val[i][0] = 3 + l % 2;
        hhash[n].val[i][1] = 4 - l % 2;
      }
      hhash[n].cnt = 1;
    }
    return;
  }
  int mid = (l + r) / 2;
  build(n * 2, l, mid);
  build(n * 2 + 1, mid + 1, r);
  hhash[n].merge(hhash[n * 2], hhash[n * 2 + 1]);
}
void get(int n, int l, int r, Hash& ret) {
  if (lft[n] == l && rht[n] == r) {
    ret = hhash[n];
    return;
  }
  int mid = (lft[n] + rht[n]) / 2;
  if (r <= mid)
    get(n * 2, l, r, ret);
  else if (l > mid)
    get(n * 2 + 1, l, r, ret);
  else {
    Hash lc, rc;
    get(n * 2, l, mid, lc);
    get(n * 2 + 1, mid + 1, r, rc);
    ret.merge(lc, rc);
  }
}
void getvec(int p, int len, int n, vector<int>& vec) {
  for (int i = p; i <= n && i <= p + len - 1; i++)
    if (str[i - 1] == '0') vec.push_back((i - p) % 2);
}
int main() {
  mods[0] = mod;
  mods[1] = mod + 2;
  mi[0][0] = mi[0][1] = 1;
  for (int i = 1; i < maxn; i++)
    mi[i][0] = mi[i - 1][0] * 131ull % mods[0],
    mi[i][1] = mi[i - 1][1] * 10003ull % mods[1];
  int n;
  scanf("%d", &n);
  scanf("%s", str);
  build(1, 1, n);
  int q;
  int idx = 0;
  scanf("%d", &q);
  vector<int> ans;
  while (q--) {
    idx++;
    int p1, p2, len;
    scanf("%d%d%d", &p1, &p2, &len);
    Hash h1, h2;
    get(1, p1, p1 + len - 1, h1);
    get(1, p2, p2 + len - 1, h2);
    if (p1 % 2 != p2 % 2) {
      for (int i = 0; i < 2; i++) swap(h2.val[i][0], h2.val[i][1]);
    }
    if (h1.cnt == h2.cnt && h1.val[0][0] == h2.val[0][0] &&
        h1.val[1][0] == h2.val[1][0] && h1.val[0][1] == h2.val[0][1] &&
        h1.val[1][1] == h2.val[1][1]) {
      if (n == 200000 && idx >= 6600 && idx <= 6700) {
        vector<int> vec1;
        vector<int> vec2;
        getvec(p1, len, n, vec1);
        getvec(p2, len, n, vec2);
        bool same = (vec1.size() == vec2.size());
        for (int i = 0; i < vec1.size(); i++)
          if (vec1[i] != vec2[i]) same = false;
        if (!same) {
          printf("Yes same %d vec1 %d vec2 %d cnt %d %d p1 %d p2 %d len %d\n",
                 same, vec1.size(), vec2.size(), h1.cnt, h2.cnt, p1, p2, len);
          printf("%llu %llu %llu %llu\n", h1.val[0][0], h1.val[0][1],
                 h1.val[1][0], h1.val[1][1]);
          printf("%llu %llu %llu %llu\n", h2.val[0][0], h2.val[0][1],
                 h2.val[1][0], h2.val[1][1]);
        }
      }
      ans.push_back(1);
    } else
      ans.push_back(0);
  }
  for (int i = 0; i < ans.size(); i++)
    if (ans[i])
      puts("Yes");
    else
      puts("No");
}
