#include <bits/stdc++.h>
using namespace std;
int gi() {
  int res = 0, w = 1;
  char ch = getchar();
  while (ch != '-' && !isdigit(ch)) ch = getchar();
  if (ch == '-') w = -1, ch = getchar();
  while (isdigit(ch)) res = res * 10 + ch - '0', ch = getchar();
  return res * w;
}
const int MAX_N = 1e5 + 5, BLK = 400;
const int Mod = 998244853;
int upd(int x) { return x + (x >> 31 & Mod); }
pair<int, unsigned long long> operator+(
    const pair<int, unsigned long long> &l,
    const pair<int, unsigned long long> &r) {
  return pair<int, unsigned long long>(upd(l.first + r.first - Mod),
                                       l.second + r.second);
}
pair<int, unsigned long long> operator-(
    const pair<int, unsigned long long> &l,
    const pair<int, unsigned long long> &r) {
  return pair<int, unsigned long long>(upd(l.first - r.first),
                                       l.second - r.second);
}
pair<int, unsigned long long> operator*(
    const pair<int, unsigned long long> &l,
    const pair<int, unsigned long long> &r) {
  return pair<int, unsigned long long>(1ll * l.first * r.first % Mod,
                                       l.second * r.second);
}
pair<int, unsigned long long> pw[MAX_N];
struct node {
  int arr[BLK + 5], siz;
  pair<int, unsigned long long> hs[BLK + 5];
  void clear() { siz = 0; }
  void ins(int x) { arr[++siz] = x; }
  void build() {
    for (int i = 1; i <= siz; i++)
      hs[i] = hs[i - 1] * pw[1] + pair<int, unsigned long long>(arr[i], arr[i]);
  }
  pair<int, unsigned long long> query(int l, int r) {
    return hs[r] - pw[r - l + 1] * hs[l - 1];
  }
} pre[MAX_N / BLK + 5], suf[MAX_N / BLK + 5];
int N, a[MAX_N], bL[MAX_N], bR[MAX_N], bel[MAX_N];
bool valid[MAX_N];
void build(int id, int bL, int bR) {
  static int stk[MAX_N];
  int top = 0;
  for (int i = bL; i <= bR; i++)
    if (top && a[i] < 0 && stk[top] == -a[i])
      --top;
    else
      stk[++top] = a[i];
  valid[id] = 1;
  for (int i = 2; i <= top; i++)
    if (stk[i] < 0 && stk[i - 1] > 0) return (void)(valid[id] = 0);
  pre[id].clear(), suf[id].clear();
  for (int i = top; i; i--)
    if (stk[i] < 0) pre[id].ins(-stk[i]);
  for (int i = 1; i <= top; i++)
    if (stk[i] > 0) suf[id].ins(stk[i]);
  pre[id].build(), suf[id].build();
}
int top;
bool Match(int id) {
  static pair<int, int> stk[MAX_N];
  if (!valid[id]) return 0;
  int len = pre[id].siz;
  while (top && len) {
    int t = min(len, stk[top].second);
    if (pre[id].query(len - t + 1, len) !=
        suf[stk[top].first].query(stk[top].second - t + 1, stk[top].second))
      return 0;
    stk[top].second -= t, len -= t;
    if (stk[top].second == 0) --top;
  }
  if (len) return 0;
  if (suf[id].siz) stk[++top] = make_pair(id, suf[id].siz);
  return 1;
}
bool query(int l, int r) {
  if (bel[r] - bel[l] <= 2) {
    static int stk[MAX_N];
    int top = 0;
    for (int i = l; i <= r; i++)
      if (top && a[i] < 0 && stk[top] == -a[i])
        --top;
      else
        stk[++top] = a[i];
    return top ? 0 : 1;
  }
  build(bel[N] + 1, l, bR[bel[l]]);
  build(bel[N] + 2, bL[bel[r]], r);
  top = 0;
  if (!Match(bel[N] + 1)) return 0;
  for (int i = bel[l] + 1; i <= bel[r] - 1; i++)
    if (!Match(i)) return 0;
  if (!Match(bel[N] + 2)) return 0;
  return top ? 0 : 1;
}
int main() {
  pw[0] = pair<int, unsigned long long>(1, 1),
  pw[1] = pair<int, unsigned long long>(19260817, 19491001);
  N = gi();
  gi();
  for (int i = 1; i <= N; i++) a[i] = gi();
  for (int i = 2; i <= N; i++) pw[i] = pw[i - 1] * pw[1];
  for (int i = 1; i <= N; i++) bel[i] = (i - 1) / BLK + 1;
  for (int i = 1; i <= N; i++) {
    if (bel[i] != bel[i - 1]) bL[bel[i]] = i;
    bR[bel[i]] = i;
  }
  for (int i = 1; i <= bel[N]; i++) build(i, bL[i], bR[i]);
  int Q = gi();
  while (Q--) {
    int op = gi(), x = gi(), y = gi();
    if (op == 1)
      a[x] = y, build(bel[x], bL[bel[x]], bR[bel[x]]);
    else
      puts(query(x, y) ? "Yes" : "No");
  }
  return 0;
}
