#include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; const int B = 31, C = (1LL << B) - 1; const mint inv4 = mint(1) / 4; using ar = array; ar op(ar a, ar b) { ar c; for (int i = 0; i < B; i++) c[i] = a[i] & b[i]; return c; } ar e() { ar r; r.fill(C); return r; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; vector v(N); for (int i = 0; i < N; i++) { int A; cin >> A; for (int j = 0; j < B; j++) { if (A & (1 << j)) v[i][j] = A; else v[i][j] = C ^ A; } } segtree seg(v); while (Q--) { int t; cin >> t; if (t == 1) { int p, x; cin >> p >> x; p--; for (int j = 0; j < B; j++) { if (x & (1 << j)) v[p][j] = x; else v[p][j] = C ^ x; } seg.set(p, v[p]); } else { int L, R; cin >> L >> R; L--; ar P = seg.prod(L, R); int m = P[B - 1]; mint s = 0, z = m; for (int k = 0; k < B; k++) { if ((m & P[k]) == 0) { s += (ll)P[k] * P[k]; m |= P[k]; } } mint t = (C - z) * (C - z) - s; mint ans = (s * 2 + t) * mint(2).pow(R - L) * inv4; cout << ans.val() << '\n'; } } }