#include using namespace std; void update(int *a, int *s, int n, int k, int p, int x) { a[p] = x; s[p / k] = 0; for (int i = (p / k) * k; i < n && i < (p / k + 1) * k; i++) s[p / k] ^= a[i]; } int query(int *a, int *s, int n, int k, int l, int r) { int xr = 0; int i = l; while (i < r && i % k == 0) { xr ^= a[i]; /* printf("xor = %d\n", xr); */ i += 1; } while (i + k < r) { xr ^= s[i / k]; i += k; } while (i <= r) { xr ^= a[i]; i += 1; } return xr; } int main() { int n, m; scanf("%d%d", &n, &m); int a[n]; int k = (int) sqrt(n); int s[n / k + 1]; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } for (int i = 0; i < n / k + 1; i++) s[i] = 0; for (int i = 0; i < n; i++) { s[i / k] ^= a[i]; } for (int i = 0; i < m; i++) { int p, b, c; scanf("%d%d%d", &p, &b, &c); if (p == 1) { update(a, s, n, k, b - 1, c); } else if (p == 2) { printf("%d\n", query(a, s, n, k, b - 1, c - 1) % 4001); } } return 0; }