#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 = 500;   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;   }   