#include using namespace std; const int MAX_K = 15001; class SegmentTree { int n; vector> tree; int K; bitset merge(const bitset& left, const bitset& right) { bitset res = left | right; for (int i = 0; i <= K; ++i) { if (left[i]) { res |= right << i; } } res &= bitset((1LL << (K + 1)) - 1); // Ensure we don't exceed K return res; } public: SegmentTree(const vector& data, int K) : K(K) { int size = data.size(); n = 1; while (n < size) n <<= 1; tree.resize(2 * n, bitset(1)); // Initialize with 0 for (int i = 0; i < size; ++i) { int val = data[i]; bitset bs; bs.set(0); if (val > 0 && val <= K) { bs.set(val); } tree[n + i] = bs; } for (int i = size; i < n; ++i) { tree[n + i].set(0); } for (int i = n - 1; i >= 1; --i) { tree[i] = merge(tree[2 * i], tree[2 * i + 1]); } } void update(int pos, int new_val) { pos += n; bitset bs; bs.set(0); if (new_val > 0 && new_val <= K) { bs.set(new_val); } tree[pos] = bs; for (pos >>= 1; pos >= 1; pos >>= 1) { tree[pos] = merge(tree[2 * pos], tree[2 * pos + 1]); } } bool query() { return tree[1][K]; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); 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; --x; // Convert to 0-based index st.update(x, v); cout << (st.query() ? 1 : 0) << '\n'; } return 0; }