#include <bits/stdc++.h>
using namespace std;
int hva[100005];
int hvb[100005];
unsigned long long int hvc[100005];
int a = 174763;
int b = 131071;
unsigned long long int c = 524287;
int expa[100005];
int expb[100005];
unsigned long long int expc[100005];
struct Hashes {
  int ha, hb;
  unsigned long long int hc;
  Hashes(int q = a, int w = b, unsigned long long int e = c)
      : ha(q), hb(w), hc(e) {}
  bool operator==(Hashes& A) { return ha == A.ha && hb == A.hb && hc == A.hc; }
  bool operator!=(Hashes A) {
    return !(ha == A.ha && hb == A.hb && hc == A.hc);
  }
  void operator+=(Hashes A) {
    ha = (ha + A.ha) % 1000000007;
    hb = (hb + A.hb) % 998244353;
    hc = hc + A.hc;
  }
  void operator-=(Hashes& A) {
    ha = (ha - A.ha + 1000000007) % 1000000007;
    hb = (hb - A.hb + 998244353) % 998244353;
    hc = hc - A.hc;
  }
  void operator*=(int x) {
    ha = (1ll * ha * expa[x]) % 1000000007;
    hb = (1ll * hb * expb[x]) % 998244353;
    hc = hc * expc[x];
  }
};
Hashes V(int v) { return Hashes(hva[v], hvb[v], hvc[v]); }
int arr[100005];
bool open[100005];
int n;
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  for (int i = 0; i <= 1e5; i++) hva[i] = i;
  for (int i = 0; i <= 1e5; i++) hvb[i] = i;
  for (int i = 0; i <= 1e5; i++) hvc[i] = i;
  expa[0] = expb[0] = expc[0] = 1;
  for (int i = 1; i <= 100001; i++) {
    expa[i] = 1ll * expa[i - 1] * a % 1000000007;
    expb[i] = 1ll * expb[i - 1] * b % 998244353;
    expc[i] = expc[i - 1] * c;
  }
  int q;
  cin >> n >> q;
  for (int i = 0; i < n; i++) {
    cin >> arr[i];
    if (arr[i] < 0) {
      open[i] = false;
      arr[i] = -arr[i];
    } else
      open[i] = true;
  }
  int sq, s;
  sq = sqrt(n);
  s = (n - 1) / sq + 1;
  vector<Hashes> phO[s], shC[s];
  bool ban[s];
  auto setph = [&](vector<Hashes>& ret, vector<int>& A) {
    ret.resize(((int)(A).size()));
    if (A.empty()) return;
    ret[0] = V(A[0]);
    for (int i = 1; i < ((int)(A).size()); i++) {
      ret[i] = ret[i - 1];
      ret[i] *= 1;
      ret[i] += V(A[i]);
    }
  };
  auto setsh = [&](vector<Hashes>& ret, vector<int>& A) {
    ret.resize(((int)(A).size()));
    if (A.empty()) return;
    reverse((A).begin(), (A).end());
    ret[0] = V(A[0]);
    for (int i = 1; i < ((int)(A).size()); i++) {
      ret[i] = ret[i - 1];
      ret[i] *= 1;
      ret[i] += V(A[i]);
    }
    reverse((A).begin(), (A).end());
    reverse((ret).begin(), (ret).end());
  };
  auto getph = [&](vector<Hashes>& H, int l, int r) {
    Hashes h = H[r];
    if (l) {
      Hashes _h = H[l - 1];
      _h *= (r - l + 1);
      h -= _h;
    }
    return h;
  };
  auto getsh = [&](vector<Hashes>& H, int l, int r) {
    Hashes h = H[l];
    if (r + 1 < ((int)(H).size())) {
      Hashes _h = H[r + 1];
      _h *= (r - l + 1);
      h -= _h;
    }
    return h;
  };
  auto getOandC = [&](vector<int>& O, vector<int>& C, int l, int r) {
    vector<int> st;
    O.clear();
    C.clear();
    for (int i = l; i <= r; i++) {
      if (open[i] || st.empty()) {
        st.push_back(i);
      } else {
        if (open[st.back()]) {
          if (arr[st.back()] == arr[i])
            st.pop_back();
          else
            return false;
        } else
          st.push_back(i);
      }
    }
    int i = 0;
    while (i < ((int)(st).size()) && !open[st[i]]) C.push_back(arr[st[i++]]);
    while (i < ((int)(st).size()) && open[st[i]]) O.push_back(arr[st[i++]]);
    assert(((int)(O).size()) + ((int)(C).size()) == ((int)(st).size()));
    return true;
  };
  auto recalc = [&](int k) {
    vector<int> O, C;
    if (getOandC(O, C, k * sq, min((k + 1) * sq - 1, n - 1))) {
      ban[k] = false;
      setph(phO[k], O);
      setsh(shC[k], C);
    } else
      ban[k] = true;
  };
  for (int i = 0; i < s; i++) recalc(i);
  cin >> q;
  while (q--) {
    int k, x, y;
    cin >> k >> x >> y;
    if (k == 1) {
      x--;
      if (y > 0)
        arr[x] = y, open[x] = true;
      else
        arr[x] = -y, open[x] = false;
      recalc(x / sq);
    } else {
      if ((y - x + 1) % 2) {
        cout << "No\n";
        continue;
      }
      x--, y--;
      bool yes = true;
      vector<int> O, C;
      vector<pair<vector<Hashes>*, int> > st;
      if (x % sq && x / sq != y / sq) {
        if (!getOandC(O, C, x, x - x % sq - 1 + sq) || ((int)(C).size())) {
          yes = false;
        }
        while (x % sq) x++;
      }
      vector<Hashes> temp;
      setph(temp, O);
      if (((int)(temp).size())) st.push_back({&temp, ((int)(temp).size())});
      while (x / sq < y / sq && yes) {
        if (ban[x / sq]) {
          yes = false;
          break;
        }
        int cc = ((int)(shC[x / sq]).size());
        int ccc = 0;
        while (cc && yes) {
          if (st.empty()) {
            yes = false;
          } else {
            if (st.back().second <= cc) {
              if (getph(*st.back().first, 0, st.back().second - 1) !=
                  getsh(shC[x / sq], ccc, ccc + st.back().second - 1)) {
                yes = false;
              } else
                cc -= st.back().second, ccc += st.back().second, st.pop_back();
            } else {
              if (getph(*st.back().first, st.back().second - cc,
                        st.back().second - 1) !=
                  getsh(shC[x / sq], ccc, ccc + cc - 1)) {
                yes = false;
              } else
                st.back().second -= cc;
              cc = 0;
            }
          }
        }
        if (((int)(phO[x / sq]).size()))
          st.push_back({&phO[x / sq], ((int)(phO[x / sq]).size())});
        x += sq;
      }
      if (x <= y && yes) {
        vector<int> O2, C2;
        vector<Hashes> temp2;
        if (!getOandC(O2, C2, x, y) || ((int)(O2).size())) {
          yes = false;
        }
        setsh(temp2, C2);
        if (((int)(temp2).size())) {
          int cc = ((int)(temp2).size());
          int ccc = 0;
          while (cc && yes) {
            if (st.empty()) {
              yes = false;
            } else {
              if (st.back().second <= cc) {
                if (getph(*st.back().first, 0, st.back().second - 1) !=
                    getsh(temp2, ccc, ccc + st.back().second - 1)) {
                  yes = false;
                } else
                  cc -= st.back().second, ccc += st.back().second,
                      st.pop_back();
              } else {
                if (getph(*st.back().first, st.back().second - cc,
                          st.back().second - 1) !=
                    getsh(temp2, ccc, ccc + cc - 1)) {
                  yes = false;
                } else
                  st.back().second -= cc;
                cc = 0;
              }
            }
          }
        }
      }
      if (((int)(st).size())) yes = false;
      if (yes)
        cout << "Yes\n";
      else
        cout << "No\n";
    }
  }
  cerr << 1.0 * clock() / CLOCKS_PER_SEC << endl;
}
