#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << H;
  debug_out(T...);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &item) {
  out << '(' << item.first << ", " << item.second << ')';
  return out;
}
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  for (const auto &item : v) out << item << ' ';
  return out;
}
const int N = 100010;
const int B = 666013;
const int SZ = 400;
const int NRB = N / SZ + 5;
struct Block {
  int i, l, r;
  Block(int i, int l, int r) : i(i), l(l), r(r) {}
};
int bid[N], s[N], aux[SZ + 5];
int nOpen[NRB], nClosed[NRB];
ull pw[N], open[NRB][SZ + 5], closed[NRB][SZ + 5];
bool ok[N];
ull getHash(ull h[], int l, int r) { return h[r] - h[l] * pw[r - l]; }
int genStack(int l, int r) {
  if (l >= N) return -2;
  int top = -1;
  for (int p = l; p < r && s[p]; ++p) {
    if (s[p] > 0)
      aux[++top] = s[p];
    else {
      if (top == -1 || aux[top] < 0)
        aux[++top] = s[p];
      else if (aux[top] != -s[p])
        return -2;
      else
        --top;
    }
  }
  return top;
}
void makeHashes(int i, int top) {
  int p;
  for (p = 0; p <= top && aux[p] < 0; ++p)
    closed[i][p + 1] = closed[i][p] * B - aux[p];
  nClosed[i] = p;
  nOpen[i] = top + 1 - p;
  reverse(aux + p, aux + p + nOpen[i]);
  for (int j = 0; p + j <= top; ++j)
    open[i][j + 1] = open[i][j] * B + aux[p + j];
}
void buildBlock(int i) {
  int top = genStack(i * SZ, (i + 1) * SZ);
  if (top == -2) return void(ok[i] = false);
  ok[i] = true;
  makeHashes(i, top);
}
void update(int p, int t) {
  s[p] = t;
  buildBlock(bid[p]);
}
bool process(int i, vector<Block> &v) {
  int a = 0, b = nClosed[i];
  while (a < b && !v.empty()) {
    auto &lst = v.back();
    int d = min(b - a, lst.r - lst.l);
    if (lst.r - lst.l <= b - a) {
      if (getHash(open[lst.i], lst.l, lst.r) == getHash(closed[i], a, a + d))
        a += d, v.pop_back();
      else
        return false;
    } else {
      if (getHash(open[lst.i], lst.l, lst.l + d) == getHash(closed[i], a, b))
        lst.l += d, a = b;
      else
        return false;
    }
  }
  if (a < b) return false;
  if (nOpen[i]) v.emplace_back(i, 0, nOpen[i]);
  return true;
}
bool query(int l, int r) {
  if (bid[l] == bid[r - 1]) return genStack(l, r) == -1;
  int lid = NRB - 2, rid = NRB - 1;
  int top = genStack(bid[l] * SZ + l % SZ, (bid[l] + 1) * SZ);
  if (top == -2) return false;
  makeHashes(lid, top);
  top = genStack(bid[r] * SZ, bid[r] * SZ + r % SZ);
  if (top == -2) return false;
  makeHashes(rid, top);
  vector<Block> v;
  if (!process(lid, v)) return false;
  for (int i = bid[l] + 1; i < bid[r]; ++i) {
    if (!ok[i]) return false;
    if (!process(i, v)) return false;
  }
  if (!process(rid, v)) return false;
  return v.empty();
}
int main() {
  ios_base::sync_with_stdio(false);
  pw[0] = 1;
  for (int i = 1; i < N; ++i) pw[i] = pw[i - 1] * B;
  for (int i = 0; i < N; ++i) bid[i] = i / SZ;
  int n, k, q, type, p, t, l, r;
  cin >> n >> k;
  for (int i = 0; i < n; ++i) cin >> s[i];
  for (int i = 0; i < NRB; ++i) buildBlock(i);
  for (cin >> q; q; --q) {
    cin >> type;
    if (type == 1) {
      cin >> p >> t;
      update(p - 1, t);
    } else {
      cin >> l >> r;
      cout << (query(l - 1, r) ? "Yes" : "No") << '\n';
    }
  }
  return 0;
}
