#include<iostream>
#include<map>
#include<cmath>
#include<cstring>
using namespace std;
int a[100005];
int main()
{
int ty,i,x,s,e,count,ans,k,blk,p;
int n,q;
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int BLOCK_SIZE=(int)ceil(sqrt(n));
int BLOCKS=(int)ceil(sqrt(n));
int b[BLOCKS];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
b[i/BLOCK_SIZE]^=a[i];
map<int,int> m1[BLOCKS];
for(int i=0;i<BLOCKS;i++)
{
s=i*BLOCK_SIZE;
e=(i+1)*BLOCK_SIZE-1;
map<int,int> m;
x=0;
for(int j=s;j<=e;j++)
{
x^=a[j];
m[x]++;
}
m1[i]=m;
}
while(q--)
{
scanf("%d",&ty);
if(ty==1)
{
scanf("%d%d",&i,&x);
i--;
blk=i/BLOCK_SIZE;
s=blk*BLOCK_SIZE;
e=(blk+1)*BLOCK_SIZE-1;
a[i]=x;
b[blk]=0;
for(int i=s;i<=e;i++)
b[blk]^=a[i];
map<int,int> m;
ans=0;
for(int i=s;i<=e;i++)
{
ans^=a[i];
m[ans]++;
}
m1[blk]=m;
}
else
{
scanf("%d%d",&i,&k);
i--;
count=0;
ans=0;
if(i<BLOCK_SIZE)
{
for(int j=0;j<=i;j++)
{
ans^=a[j];
if(ans==k)
count++;
}
}
else
{
blk=i/BLOCK_SIZE;
for(int j=0;j<=blk-1;j++)
{
p=ans^k;
count+=m1[j].count(p);
ans^=b[j];
}
s=blk*BLOCK_SIZE;
e=i;
p=0;
for(int j=s;j<=e;j++)
{
p^=a[j];
if((ans^p)==k)
count++;
}
}
printf("%d\n",count);
}
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPG1hcD4KI2luY2x1ZGU8Y21hdGg+CiNpbmNsdWRlPGNzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBhWzEwMDAwNV07CmludCBtYWluKCkKewoJaW50IHR5LGkseCxzLGUsY291bnQsYW5zLGssYmxrLHA7CglpbnQgbixxOwoJc2NhbmYoIiVkJWQiLCZuLCZxKTsKCWZvcihpbnQgaT0wO2k8bjtpKyspCgkJc2NhbmYoIiVkIiwmYVtpXSk7CglpbnQgQkxPQ0tfU0laRT0oaW50KWNlaWwoc3FydChuKSk7CglpbnQgQkxPQ0tTPShpbnQpY2VpbChzcXJ0KG4pKTsKCWludCBiW0JMT0NLU107CgltZW1zZXQoYiwwLHNpemVvZihiKSk7Cglmb3IoaW50IGk9MDtpPG47aSsrKQoJCWJbaS9CTE9DS19TSVpFXV49YVtpXTsKCW1hcDxpbnQsaW50PiBtMVtCTE9DS1NdOwoJZm9yKGludCBpPTA7aTxCTE9DS1M7aSsrKQoJewoJCXM9aSpCTE9DS19TSVpFOwoJCWU9KGkrMSkqQkxPQ0tfU0laRS0xOwoJCW1hcDxpbnQsaW50PiBtOwoJCXg9MDsKCQlmb3IoaW50IGo9cztqPD1lO2orKykKCQl7CgkJCXhePWFbal07CgkJCW1beF0rKzsKCQl9CgkJbTFbaV09bTsKCX0KCQoJd2hpbGUocS0tKQoJewoJCXNjYW5mKCIlZCIsJnR5KTsKCQlpZih0eT09MSkKCQl7CgkJCXNjYW5mKCIlZCVkIiwmaSwmeCk7CgkJCWktLTsKCQkJYmxrPWkvQkxPQ0tfU0laRTsKCQkJcz1ibGsqQkxPQ0tfU0laRTsKCQkJZT0oYmxrKzEpKkJMT0NLX1NJWkUtMTsKCQkJYVtpXT14OwoJCQliW2Jsa109MDsKCQkJZm9yKGludCBpPXM7aTw9ZTtpKyspCgkJCQliW2Jsa11ePWFbaV07CgkJCW1hcDxpbnQsaW50PiBtOwoJCQlhbnM9MDsKCQkJZm9yKGludCBpPXM7aTw9ZTtpKyspCgkJCXsKCQkJCWFuc149YVtpXTsKCQkJCW1bYW5zXSsrOwoJCQl9CgkJCW0xW2Jsa109bTsKCQl9CgkJZWxzZQoJCXsJCgkJCXNjYW5mKCIlZCVkIiwmaSwmayk7CgkJCWktLTsKCQkJY291bnQ9MDsKCQkJYW5zPTA7CgkJCWlmKGk8QkxPQ0tfU0laRSkKCQkJewoJCQkJZm9yKGludCBqPTA7ajw9aTtqKyspCgkJCQl7CgkJCQkJYW5zXj1hW2pdOwoJCQkJCWlmKGFucz09aykKCQkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJsaz1pL0JMT0NLX1NJWkU7CgkJCQlmb3IoaW50IGo9MDtqPD1ibGstMTtqKyspCgkJCQl7CgkJCQkJcD1hbnNeazsKCQkJCQljb3VudCs9bTFbal0uY291bnQocCk7CgkJCQkJYW5zXj1iW2pdOwoJCQkJfQoJCQkJcz1ibGsqQkxPQ0tfU0laRTsKCQkJCWU9aTsKCQkJCXA9MDsKCQkJCWZvcihpbnQgaj1zO2o8PWU7aisrKQkJCQkKCQkJCXsKCQkJCQlwXj1hW2pdOwoJCQkJCWlmKChhbnNecCk9PWspCgkJCQkJCWNvdW50Kys7CQkJCQkKCQkJCX0KCQkJfQoJCQlwcmludGYoIiVkXG4iLGNvdW50KTsKCQl9Cgl9CgoJcmV0dXJuIDA7Cn0K