#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; int op(int a, int b) { return a & b; } int e() { return C; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; vector> seg(B, segtree(N)); for (int i = 0; i < N; i++) { int A; cin >> A; for (int j = 0; j < B; j++) { seg[j].set(i, (A & (1 << j)) ? A : (C ^ A)); } } while (Q--) { int t; cin >> t; if (t == 1) { int p, x; cin >> p >> x; p--; for (int j = 0; j < B; j++) { seg[j].set(p, (x & (1 << j)) ? x : (C ^ x)); } } else { int L, R; cin >> L >> R; L--; int m = seg[B - 1].prod(L, R); mint s = 0, z = m; for (int k = 0; k < B; k++) { if (m & (1 << k)) continue; int p = seg[k].prod(L, R); if ((m & p) == 0) { s += (ll)p * p; m |= p; } } mint t = (C - z) * (C - z) - s; mint ans = (s * 2 + t) * mint(2).pow(R - L) * inv4; cout << ans.val() << '\n'; } } }