#include #include #include #include #include using std::cin; using std::cout; const char endl = '\n'; const int N = 1e6 + 5, M = 1e5 + 5; int n, m, q, cnt, a[N]; std::map map; std::tuple ops[N]; bool f[(1 << 10) + 5][M]; struct node { int l, r, d, s; node(int _l = 0, int _r = 0) : l(_l), r(_r), d(0), s(0) {} } tr[N << 2]; void pushup(int u) { tr[u].s = tr[u << 1].s | tr[u << 1 | 1].s; } void pushdown(int u) { if (!tr[u].d) return; tr[u << 1].s = tr[u << 1 | 1].s = 1 << map[tr[u].d]; tr[u << 1].d = tr[u << 1 | 1].d = tr[u].d; tr[u].d = 0; } void build(int u, int l, int r) { tr[u] = node(l, r); if (l == r) { tr[u].s = 1 << map[a[l]]; return; } int mid = (l + r) >> 1; build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r); pushup(u); } void modify(int u, int l, int r, int x) { if (l <= tr[u].l && tr[u].r <= r) { tr[u].s = 1 << map[x]; tr[u].d = x; return; } pushdown(u); int mid = (tr[u].l + tr[u].r) >> 1; if (l <= mid) modify(u << 1, l, r, x); if (r > mid) modify(u << 1 | 1, l, r, x); pushup(u); } int query(int u, int l, int r) { if (l <= tr[u].l && tr[u].r <= r) return tr[u].s; pushdown(u); int mid = (tr[u].l + tr[u].r) >> 1; int res = 0; if (l <= mid) res |= query(u << 1, l, r); if (r > mid) res |= query(u << 1 | 1, l, r); return res; } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> q; for (int i = 1; i <= n; i++) { cin >> a[i]; if (!map.count(a[i])) map[a[i]] = -1; } for (int i = 1, op, l, r, x; i <= q; i++) { cin >> op >> l >> r >> x; if (op == 1) { if (!map.count(x)) map[x] = -1; } ops[i] = std::make_tuple(op, l, r, x); } std::vector nums; for (auto &item : map) { nums.emplace_back(item.first); item.second = cnt++; } f[0][0] = true; for (int s = 1; s < 1 << cnt; s++) { int p = __builtin_ctz(s); for (int i = 0; i <= m; i++) { f[s][i] |= f[s ^ (1 << p)][i]; } for (int i = nums[p]; i <= m; i++) { f[s][i] |= f[s][i - nums[p]]; } } build(1, 1, n); for (int i = 1, op, l, r, x; i <= q; i++) { std::tie(op, l, r, x) = ops[i]; if (op == 1) { modify(1, l, r, x); } else { // op == 2 int s = query(1, l, r); cout << (f[s][x] ? "Yes" : "No") << endl; } } return 0; }