#include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; const int B = 30; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); 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); vector> pr(B); for (int i = 0; i < B; i++) { hash[i] = (bit[i].sum(L, R) / pw2[L]).val(); pr[i] = {hash[i], (1 << i)}; } sort(pr.begin(), pr.end()); mint al = (1 << B) - 1, s = 0, z = 0; int i = 0; while (i < B) { int j = i; mint d = 0; while (j < B && pr[i].first == pr[j].first) { d += pr[j].second; j++; } if (pr[i].first == 0) { z += d; } else { s += d * d; } i = j; } mint t = (al - z) * (al - z) - s; mint ans = (s * 2 + t) * mint(2).pow(R - L) * inv4; cout << ans.val() << '\n'; } } }