#include <bits/stdc++.h>
using namespace std;
const int HA = 2;
const int PP[] = {318255569, 259906247, 66604919, 19260817},
          QQ[] = {1010451419, 1011111133, 1021111159, 1033111117};
int pw[HA][201111];
void initHash() {
  for (int h = 0; h < HA; h++) {
    pw[h][0] = 1;
    for (int i = 1; i < 201111; i++)
      pw[h][i] = int((unsigned long long)pw[h][i - 1] * PP[h] % QQ[h]);
  }
}
struct hashInit {
  hashInit() { initHash(); }
} __init_hash;
struct Hash {
  int v[HA], len;
  Hash() {
    memset(v, 0, sizeof v);
    len = 0;
  }
  Hash(int x) {
    for (int h = 0; h < HA; h++) v[h] = x;
    len = 1;
  }
  friend Hash operator+(const Hash &a, const Hash &b) {
    Hash ret;
    ret.len = a.len + b.len;
    for (int h = 0; h < HA; h++)
      ret.v[h] =
          int(((unsigned long long)a.v[h] * pw[h][b.len] + b.v[h]) % QQ[h]);
    return ret;
  }
  friend Hash operator+(const Hash &a, const int &b) {
    Hash ret;
    ret.len = a.len + 1;
    for (int h = 0; h < HA; h++)
      ret.v[h] = int(((unsigned long long)a.v[h] * PP[h] + b) % QQ[h]);
    return ret;
  }
  friend Hash operator+(const int &a, const Hash &b) {
    Hash ret;
    ret.len = b.len + 1;
    for (int h = 0; h < HA; h++)
      ret.v[h] = int(((unsigned long long)a * pw[h][b.len] + b.v[h]) % QQ[h]);
    return ret;
  }
  friend Hash operator-(const Hash &a, const Hash &b) {
    Hash ret;
    ret.len = a.len - b.len;
    for (int h = 0; h < HA; h++) {
      ret.v[h] =
          int((a.v[h] - (unsigned long long)pw[h][b.len] * b.v[h]) % QQ[h]);
      if (ret.v[h] < 0) ret.v[h] += QQ[h];
    }
    return ret;
  }
  friend bool operator==(const Hash &a, const Hash &b) {
    for (int h = 0; h < HA; h++)
      if (a.v[h] != b.v[h]) return false;
    return a.len == b.len;
  }
};
int n, q;
struct node {
  int l, r;
  Hash v0, v1;
} t[201111 * 2];
int tcnt = 0;
char s[201111];
int build(int l, int r) {
  int x = ++tcnt;
  if (l < r) {
    int mid = (l + r) / 2;
    t[x].l = build(l, mid);
    t[x].r = build(mid + 1, r);
    t[x].v0 = t[t[x].l].v0 + t[t[x].r].v0;
    t[x].v1 = t[t[x].l].v1 + t[t[x].r].v1;
  } else {
    if (s[l] == '0') {
      t[x].v0 = Hash(l % 2 + 1);
      t[x].v1 = Hash((l + 1) % 2 + 1);
    }
  }
  return x;
}
pair<Hash, Hash> qry(int x, int l, int r, int ql, int qr) {
  if (l == ql && r == qr) return {t[x].v0, t[x].v1};
  int mid = (l + r) / 2;
  if (qr <= mid) return qry(t[x].l, l, mid, ql, qr);
  if (ql > mid) return qry(t[x].r, mid + 1, r, ql, qr);
  pair<Hash, Hash> r1 = qry(t[x].l, l, mid, ql, mid),
                   r2 = qry(t[x].r, mid + 1, r, mid + 1, qr);
  r1.first = r1.first + r2.first;
  r1.second = r1.second + r2.second;
  return r1;
}
int cnt[201111];
int main() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  build(1, n);
  scanf("%d", &q);
  for (int i = 1; i <= q; i++) {
    int l, r, len;
    scanf("%d%d%d", &l, &r, &len);
    pair<Hash, Hash> u = qry(1, 1, n, l, l + len - 1);
    pair<Hash, Hash> v = qry(1, 1, n, r, r + len - 1);
    puts((l & 1 ? u.first : u.second) == (r & 1 ? v.first : v.second) ? "YES"
                                                                      : "NO");
  }
}
