#include #include using namespace std; int N, M; int A[100002]; int S[10]; int ARB[10][4 * 100002], Aw, A1, A2, Ar; bool is[10][4 * 100002]; void change(int nod, int i1, int i2) { if (A1 <= i1 && i2 <= A2) { is[Aw][nod] = !is[Aw][nod]; ARB[Aw][nod] = (i2 - i1 + 1) - ARB[Aw][nod]; return; } int mid = (i1 + i2) / 2; if (is[Aw][nod]) { is[Aw][nod] = !is[Aw][nod]; is[Aw][nod * 2] = !is[Aw][nod * 2]; ARB[Aw][nod * 2] = (mid - i1 + 1) - ARB[Aw][nod * 2]; is[Aw][nod * 2 + 1] = !is[Aw][nod * 2 + 1]; ARB[Aw][nod * 2 + 1] = (i2 - mid) - ARB[Aw][nod * 2 + 1]; } if (A1 <= mid) change(nod * 2, i1, mid); if (A2 > mid) change(nod * 2 + 1, mid + 1, i2); ARB[Aw][nod] = ARB[Aw][nod * 2] + ARB[Aw][nod * 2 + 1]; } void query(int nod, int i1, int i2) { if (A1 <= i1 && i2 <= A2) { Ar += ARB[Aw][nod]; return; } int mid = (i1 + i2) / 2; if (is[Aw][nod]) { is[Aw][nod] = !is[Aw][nod]; is[Aw][nod * 2] = !is[Aw][nod * 2]; ARB[Aw][nod * 2] = (mid - i1 + 1) - ARB[Aw][nod * 2]; is[Aw][nod * 2 + 1] = !is[Aw][nod * 2 + 1]; ARB[Aw][nod * 2 + 1] = (i2 - mid) - ARB[Aw][nod * 2 + 1]; } if (A1 <= mid) query(nod * 2, i1, mid); if (A2 > mid) query(nod * 2 + 1, mid + 1, i2); } int main() { cin.sync_with_stdio(false); cin >> N >> M; for (int i = 1; i <= N; ++i) { cin >> A[i]; for (int j = 0; j < 10; ++j) if ((A[i] & (1 << j)) != (0 & (1 << j))) { Aw = j, A1 = i, A2 = N; change(1, 1, N); } } for (int i = 1, type; i <= M; ++i) { cin >> type; if (type == 1) { int wh, val; cin >> wh >> val; for (int j = 0; j < 10; ++j) if ((val & (1 << j)) != (A[wh] & (1 << j))) { Aw = j, A1 = wh, A2 = N; change(1, 1, N); } A[wh] = val; } else { int i1, i2; cin >> i1 >> i2; --i1; long long result = 0; for (int j = 0; j < 10; ++j) { Aw = j, A1 = i1, A2 = i2, Ar = 0; query(1, 1, N); long long total = 1LL * (i2 - i1 + 1 - Ar) * Ar; result += total * (1 << j); } cout << result << '\n'; } } }