#include <bits/stdc++.h>

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;
}