#include #include #include using namespace std; using namespace atcoder; using ll = long long; using minth = modint; using mint = modint998244353; const int B = 30, M = 5e8; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); random_device rd; mt19937 mt(rd()); int mod = mt() % M * 2 + M * 2 + 1; minth::set_mod(mod); const mint inv4 = mint(1) / 4; int N, Q; cin >> N >> Q; vector A(N); for (int i = 0; i < N; i++) cin >> A[i]; vector pw2(N + 1); pw2[0] = 1; for (int i = 0; i < N; i++) pw2[i + 1] = pw2[i] * 2; vector> bit(B, fenwick_tree(N)); for (int i = 0; i < N; i++) { for (int j = 0; j < B; j++) { if (A[i] & (1 << j)) { bit[j].add(i, pw2[i]); } } } while (Q--) { int t; cin >> t; if (t == 1) { int p, x; cin >> p >> x; p--; for (int j = 0; j < B; j++) { int c = (A[p] >> j) & 1, d = (x >> j) & 1; if (c != d) { if (c == 0) bit[j].add(p, pw2[p]); else bit[j].add(p, -pw2[p]); } } A[p] = x; } else { int L, R; cin >> L >> R; L--; vector hash(B); map mh; for (int i = 0; i < B; i++) { hash[i] = (bit[i].sum(L, R) / pw2[L]).val(); mh[hash[i]] += (1 << i); } mint al = (1 << B) - 1; mint s = 0, z = 0; for (auto [h, d]: mh) { if (h != 0) { s += d * d; } else { z += d; } } mint t = (al - z) * (al - z) - s; mint ans = (s * 2 + t) * mint(2).pow(R - L) * inv4; cout << ans.val() << '\n'; } } }