#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
bool t[maxn];
int des[maxn];
int cont[maxn];
long long mod = 1e9 + 7;
const long long div5 = 400000003;
long long pows[maxn] = {1, 5};
struct merg {
  int nuo, iki, del;
  long long val;
  bool kaire, desine;
  bool operator==(const merg& kitas) { return val == kitas.val; }
  merg() {}
  merg(int a, int b, long long c, bool d, bool e, int f) {
    nuo = a;
    iki = b;
    val = c;
    kaire = d;
    desine = e;
    del = f;
  }
};
int len(const merg& a) { return a.iki - a.nuo + 1 - 2 * a.del; }
merg merge(const merg& a, const merg& b) {
  if (a.desine && b.kaire) {
    if (len(a) == 1 && len(b) == 1)
      return merg(a.nuo, b.iki, 0, 0, 0, a.del + b.del + 1);
    if (len(a) == 1)
      return merg(a.nuo, b.iki, (b.val - 1 + mod) % mod * div5 % mod,
                  len(b) == 2 ? b.desine : 0, b.desine, a.del + b.del + 1);
    if (len(b) == 1)
      return merg(a.nuo, b.iki, (a.val - pows[len(a) - 1] + mod) % mod, a.kaire,
                  len(a) == 2 ? a.kaire : 0, a.del + b.del + 1);
    long long l = (a.val - pows[len(a) - 1] + mod) % mod;
    long long r = (b.val - 1 + mod) % mod * pows[len(a) - 2] % mod;
    return merg(a.nuo, b.iki, (l + r) % mod, a.kaire, b.desine,
                a.del + b.del + 1);
  }
  if (len(a) == 0)
    return merg(a.nuo, b.iki, b.val, b.kaire, b.desine, a.del + b.del);
  if (len(b) == 0)
    return merg(a.nuo, b.iki, a.val, a.kaire, a.desine, a.del + b.del);
  return merg(a.nuo, b.iki, (a.val + b.val * pows[len(a)] % mod) % mod, a.kaire,
              b.desine, a.del + b.del);
}
struct node {
  merg info;
  node *left, *right;
  merg get(int a, int b) {
    if (a <= info.nuo && b >= info.iki) return info;
    if (b < right->info.nuo) return left->get(a, b);
    if (a > left->info.iki) return right->get(a, b);
    auto aaa = merge(left->get(a, b), right->get(a, b));
    return aaa;
  }
  node(int a, int b) {
    if (a == b) {
      left = 0;
      right = 0;
      info = merg(a, b, t[a], t[a], t[a], 0);
    } else {
      left = new node(a, (a + b) / 2);
      right = new node((a + b) / 2 + 1, b);
      info = merge(left->info, right->info);
    }
  }
};
long long powa(long long a, long long p) {
  if (p == 1) return a;
  long long pk = powa(a * a % mod, p / 2);
  if (p % 2) return pk % mod * a % mod;
  return pk % mod;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, q;
  string tt;
  cin >> n >> tt >> q;
  for (int i = 0; i < n; ++i) {
    t[i] = tt[i] - '0';
  }
  des[n - 1] = t[n - 1];
  for (int i = n - 2; i >= 0; --i) {
    des[i] = des[i + 1] + t[i];
  }
  cont[n - 1] = t[n - 1];
  for (int i = n - 2; i >= 0; --i) {
    cont[i] = cont[i + 1] + t[i];
    if (!t[i]) cont[i] = 0;
  }
  for (int i = 2; i < n; ++i) {
    pows[i] = pows[i - 1] * pows[1] % mod;
  }
  node medis(0, n - 1);
  for (int i = 0; i < q; ++i) {
    int l1, l2, len;
    cin >> l1 >> l2 >> len;
    int a = des[--l1];
    int b = des[--l2];
    if (l1 + len - 1 < n - 1) a -= des[l1 + len];
    if (l2 + len - 1 < n - 1) b -= des[l2 + len];
    if (a != b) {
      cout << "No\n";
      continue;
    }
    cout << (medis.get(l1, l1 + len - 1) == (medis.get(l2, l2 + len - 1))
                 ? "Yes"
                 : "No")
         << '\n';
  }
  return 0;
}
