#include using namespace std; const int MAX_K = 15000; class SegmentTree { struct Node { bitset bs; }; int n, K; vector tree; void merge(bitset& res, const bitset& L, const bitset& R) { res = L | R; if (res[K]) return; for (int t = 0; t <= K; ++t) { if (R[t]) { auto shifted = L << t; res |= shifted; if (res[K]) break; } } } void update(int pos, const bitset& val) { pos += n; tree[pos].bs = val; for (pos >>= 1; pos >= 1; pos >>= 1) { int left = 2 * pos; int right = 2 * pos + 1; merge(tree[pos].bs, tree[left].bs, tree[right].bs); } } public: SegmentTree(const vector& A, int K_val) : K(K_val) { int size = A.size(); n = 1; while (n < size) n <<= 1; tree.resize(2 * n); for (int i = 0; i < size; ++i) { int a = A[i]; bitset bs; bs.set(0); if (a <= K) bs.set(a); tree[n + i].bs = bs; } for (int i = n - 1; i >= 1; --i) { merge(tree[i].bs, tree[2 * i].bs, tree[2 * i + 1].bs); } } void updateElement(int index, int value) { bitset bs; bs.set(0); if (value <= K) bs.set(value); update(index, bs); } bool query() { return tree[1].bs[K]; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int N, K; cin >> N >> K; vector A(N); for (int i = 0; i < N; ++i) { cin >> A[i]; } SegmentTree st(A, K); int Q; cin >> Q; while (Q--) { int x, v; cin >> x >> v; st.updateElement(x - 1, v); // Convert to 0-based index cout << (st.query() ? 1 : 0) << '\n'; } return 0; }