#include using namespace std; const int MAXK = 15000; using BS = bitset; struct SegmentTree { int n, K; vector tree; int size; SegmentTree(int _n, int _K, const vector& A) : n(_n), K(_K) { size = 1; while (size < n) size <<= 1; tree.resize(2 * size, BS()); for (int i = 0; i < n; ++i) { int pos = size + i; if (A[i] <= K) { tree[pos].set(0); tree[pos].set(A[i]); } else { tree[pos].set(0); } } for (int i = size - 1; i > 0; --i) { tree[i] = merge(tree[2 * i], tree[2 * i + 1]); } } BS merge(const BS& l, const BS& r) { BS res = l | r; for (int t = r._Find_first(); t <= K; t = r._Find_next(t)) { if (t > K) break; res |= (l << t) & mask(); } return res & mask(); } BS mask() const { BS m; for (int i = 0; i <= K; ++i) m.set(i); return m; } void update(int x, int v) { int pos = size + x; tree[pos].reset(); tree[pos].set(0); if (v <= K) { tree[pos].set(v); } pos >>= 1; while (pos >= 1) { tree[pos] = merge(tree[2 * pos], tree[2 * pos + 1]); 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& a : A) cin >> a; SegmentTree st(N, K, A); int Q; cin >> Q; while (Q--) { int x, v; cin >> x >> v; st.update(x - 1, v); cout << st.query() << '\n'; } return 0; }