#line 1 "template/template.hpp" #include #if __has_include() #include #endif using namespace std; using int64 = long long; const int64 infll = (1LL << 62) - 1; const int inf = (1 << 30) - 1; struct IoSetup { IoSetup() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(10); cerr << fixed << setprecision(10); } } iosetup; template ostream& operator<<(ostream& os, const pair& p) { os << p.first << " " << p.second; return os; } template istream& operator>>(istream& is, pair& p) { is >> p.first >> p.second; return is; } template ostream& operator<<(ostream& os, const vector& v) { for (size_t i = 0; i < v.size(); i++) { os << v[i] << (i + 1 != v.size() ? " " : ""); } return os; } template istream& operator>>(istream& is, vector& v) { for (T& in : v) is >> in; return is; } template bool chmax(T1& a, T2 b) { return a < b && (a = b, true); } template bool chmin(T1& a, T2 b) { return a > b && (a = b, true); } template vector make_v(size_t a) { return vector(a); } template auto make_v(size_t a, Ts... ts) { return vector(ts...))>(a, make_v(ts...)); } template enable_if_t == 0> fill_v(T& t, const V& v) { t = v; } template enable_if_t != 0> fill_v(T& t, const V& v) { for (auto& e : t) fill_v(e, v); } template struct FixPoint : F { explicit FixPoint(F&& f) : F(std::forward(f)) {} template decltype(auto) operator()(Args&&... args) const { return F::operator()(*this, std::forward(args)...); } }; template decltype(auto) MFP(F&& f) { return FixPoint{std::forward(f)}; } #line 2 "structure/segment-tree/lazy-segment-tree.hpp" #include #include #include #include #line 2 "structure/class/acted-monoid.hpp" template struct LambdaActedMonoid { using S = S2; using F = F2; S op(const S& a, const S& b) const { return _op(a, b); } S e() const { return _e(); } S mapping(const S& x, const F& f) const { return _mapping(x, f); } F composition(const F& f, const F& g) const { return _composition(f, g); } F id() const { return _id(); } LambdaActedMonoid(Op _op, E _e, Mapping _mapping, Composition _composition, Id _id) : _op(_op), _e(_e), _mapping(_mapping), _composition(_composition), _id(_id) {} private: Op _op; E _e; Mapping _mapping; Composition _composition; Id _id; }; template LambdaActedMonoid(Op _op, E _e, Mapping _mapping, Composition _composition, Id _id) -> LambdaActedMonoid; /* struct ActedMonoid { using S = ?; using F = ?; static constexpr S op(const S& a, const S& b) {} static constexpr S e() {} static constexpr S mapping(const S &x, const F &f) {} static constexpr F composition(const F &f, const F &g) {} static constexpr F id() {} }; */ #line 9 "structure/segment-tree/lazy-segment-tree.hpp" template struct LazySegmentTree { using S = typename ActedMonoid::S; using F = typename ActedMonoid::F; private: ActedMonoid m; int n{}, sz{}, height{}; std::vector data; std::vector lazy; inline void update(int k) { data[k] = m.op(data[2 * k + 0], data[2 * k + 1]); } inline void all_apply(int k, const F& x) { data[k] = m.mapping(data[k], x); if (k < sz) lazy[k] = m.composition(lazy[k], x); } inline void propagate(int k) { if (lazy[k] != m.id()) { all_apply(2 * k + 0, lazy[k]); all_apply(2 * k + 1, lazy[k]); lazy[k] = m.id(); } } public: LazySegmentTree() = default; explicit LazySegmentTree(ActedMonoid m, int n) : m(m), n(n) { sz = 1; height = 0; while (sz < n) sz <<= 1, height++; data.assign(2 * sz, m.e()); lazy.assign(2 * sz, m.id()); } explicit LazySegmentTree(ActedMonoid m, const std::vector& v) : LazySegmentTree(m, static_cast(v.size())) { build(v); } void build(const std::vector& v) { assert(n == (int)v.size()); for (int k = 0; k < n; k++) data[k + sz] = v[k]; for (int k = sz - 1; k > 0; k--) update(k); } void set(int k, const S& x) { k += sz; for (int i = height; i > 0; i--) propagate(k >> i); data[k] = x; for (int i = 1; i <= height; i++) update(k >> i); } S get(int k) { k += sz; for (int i = height; i > 0; i--) propagate(k >> i); return data[k]; } S operator[](int k) { return get(k); } S prod(int l, int r) { if (l >= r) return m.e(); l += sz; r += sz; for (int i = height; i > 0; i--) { if (((l >> i) << i) != l) propagate(l >> i); if (((r >> i) << i) != r) propagate((r - 1) >> i); } S L = m.e(), R = m.e(); for (; l < r; l >>= 1, r >>= 1) { if (l & 1) L = m.op(L, data[l++]); if (r & 1) R = m.op(data[--r], R); } return m.op(L, R); } S all_prod() const { return data[1]; } void apply(int k, const F& f) { k += sz; for (int i = height; i > 0; i--) propagate(k >> i); data[k] = m.mapping(data[k], f); for (int i = 1; i <= height; i++) update(k >> i); } void apply(int l, int r, const F& f) { if (l >= r) return; l += sz; r += sz; for (int i = height; i > 0; i--) { if (((l >> i) << i) != l) propagate(l >> i); if (((r >> i) << i) != r) propagate((r - 1) >> i); } { int l2 = l, r2 = r; for (; l < r; l >>= 1, r >>= 1) { if (l & 1) all_apply(l++, f); if (r & 1) all_apply(--r, f); } l = l2, r = r2; } for (int i = 1; i <= height; i++) { if (((l >> i) << i) != l) update(l >> i); if (((r >> i) << i) != r) update((r - 1) >> i); } } template std::optional find_first(int l, const C& check) { if (l >= n) return std::nullopt; l += sz; for (int i = height; i > 0; i--) propagate(l >> i); S sum = m.e(); do { while ((l & 1) == 0) l >>= 1; if (check(m.op(sum, data[l]))) { while (l < sz) { propagate(l); l <<= 1; auto nxt = m.op(sum, data[l]); if (not check(nxt)) { sum = nxt; l++; } } return l + 1 - sz; } sum = m.op(sum, data[l++]); } while ((l & -l) != l); return std::nullopt; } template std::optional find_last(int r, const C& check) { if (r <= 0) return std::nullopt; r += sz; for (int i = height; i > 0; i--) propagate((r - 1) >> i); S sum = m.e(); do { r--; while (r > 1 and (r & 1)) r >>= 1; if (check(m.op(data[r], sum))) { while (r < sz) { propagate(r); r = (r << 1) + 1; auto nxt = m.op(data[r], sum); if (not check(nxt)) { sum = nxt; r--; } } return r - sz; } sum = m.op(data[r], sum); } while ((r & -r) != r); return std::nullopt; } }; constexpr int mask = (1 << 30) - 1; struct ActedMonoid { struct S { uint32_t sum, old, len; }; using F = char; static constexpr S op(const S& a, const S& b) { return {.sum = a.sum + b.sum, .old = a.old + b.old, .len = a.len + b.len}; } static constexpr S e() { return {.sum = 0, .old = 0, .len = 0}; } static constexpr S mapping(const S &x, const F &f) { if (f == -1) return x; if (f == 0) return {.sum = 0, .old = x.old, .len = x.len}; if (f == 1) return {.sum = x.len, .old = x.old, .len = x.len}; return {.sum = x.old, .old = x.old, .len = x.len}; } static constexpr F composition(const F &f, const F &g) { if (g == -1) return f; return g; } static constexpr F id() { return -1; } }; int main() { int N, M; cin >> N >> M; vector< int > A(N), l(M), r(M), x(M), L(M), R(M); cin >> A >> l >> r >> x >> L >> R; int Q; cin >> Q; using Seg = LazySegmentTree< ActedMonoid >; vector< Seg > segs; for (int i = 0; i < 30; i++) { vector< Seg::S > init(N); for (int j = 0; j < N; j++) { unsigned v = (A[j] >> i) & 1; init[j] = {.sum = v, .old = v, .len = 1}; } segs.emplace_back(ActedMonoid(), init); } for (int i = 1; i <= Q; i++) { int s, q; cin >> s >> q; int y = i; for (int j = 1; j <= q; j++) { int z = (s + j) % M; int u = min(N, max(1, l[z] ^ y)) - 1; int v = min(N, max(1, r[z] ^ y)) - 1; int U = min(N, max(1, L[z] ^ y)) - 1; int V = min(N, max(1, R[z] ^ y)) - 1; int ll = min(u, v); int rr = max(u, v) + 1; int LL = min(U, V); int RR = max(U, V) + 1; if (z % 2 == 1) { auto val = x[z] ^ y; for (unsigned bit = val; bit; bit &= bit - 1) { auto b = countr_zero(bit); segs[b].apply(ll, rr, 1); } } else { auto val = x[z] ^ y; val = ~val & mask; for (int bits = val; bits; bits &= bits - 1) { int b = countr_zero((unsigned)bits); segs[b].apply(ll, rr, 0); } } y = 0; for (int k = 0; k < 30; k++) { auto c = segs[k].prod(LL, RR).sum; y = y + ((uint64_t)c << k) & mask; } } for (int k = 0; k < 30; k++) { segs[k].apply(0, N, 2); } cout << y << "\n"; } }