//
// Created by lucifer on 25-Mar-24.
//
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define PB push_back
struct segTree{
int n;
vector<int> st;
void init(int sz){
this->n = sz;
st.resize(4*n,0);
}
void build(vector<int> &v){
build(0,n-1,0,v);
}
void build(int start,int end,int node,vector<int> &v){
if(start == end){
st[node] = v[start];
return;
}
int mid = (start+end)/2;
build(start,mid,2*node+1,v);
build(mid+1,end,2*node+2,v);
st[node] = st[2*node+1]+st[2*node+2];
}
void update(int x,int y){
update(0,n-1,0,x,y);
}
void update(int start,int end,int node,int index,int value){
if(start == end){
st[node] = value;
return;
}
int mid = (start+end)/2;
if(index <=mid){
update(start,mid,2*node+1,index,value);
}else{
update(mid+1,end,2*node+2,index,value);
}
st[node] = st[2*node+1]+st[2*node+2];
}
int query(int l,int r){
return query(0,n-1,0,l,r);
}
int query(int start,int end,int node,int l,int r){
if(start>r || end<l) return 0;
if(start>=l && end<=r) return st[node];
int mid = (start+end)/2;
int q1 = query(start,mid,2*node+1,l,r);
int q2 = query(mid+1,end,2*node+2,l,r);
return q1+q2;
}
};
int main(){
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
int N,M; cin>>N>>M;
vector<int> v;
int x;
for(int i = 0;i<N;i++){
cin>>x; v.PB(x);
}
segTree tree;
tree.init(N);
tree.build(v);
while(M--){
int a,b,c;cin>>a>>b>>c;
b-=1;
if(a == 0){
//v[b] -= c;
v[b] = (v[b]^(v[b]-1))&v[b];
tree.update(b,v[b]);
}else{
cout<<tree.query(b,c)<<'\n';
}
}
return 0;
}