#include <cstdio>
#define Nmax (1<<16)+666
using namespace std;
int N,M,A,B,x,ind,answer;
char Buffer;
void scan(int &A,int endline) // endline -> cu flush
{
A = 0;
do
{
Buffer = fgetc(stdin);
if('0' <= Buffer && Buffer <= '9')
A = A * 10 + Buffer - 48;
}while('0' <= Buffer && Buffer <= '9');
if( !endline )
while(Buffer != '\n')
Buffer = fgetc(stdin);
}
class SegmentTree{
private:
int range[ Nmax ];
public:
void Build(int li,int lf,int pz)
{
if(li == lf)
{
scan(x,li^N);
range[ pz ] = x;
return;
}
int m = li+((lf-li)>>1);
Build(li,m,pz<<1);
Build(m+1,lf,(pz<<1)|1);
range[ pz ] = range[pz<<1] + range[(pz<<1)|1];
}
void Update(int li,int lf,int pz)
{
if(li == lf)
{
range[ pz ] -= x;
return;
}
int m = li+((lf-li)>>1);
if(ind <= m)
Update(li,m,pz<<1);
else
Update(m+1,lf,(pz<<1)|1);
range[ pz ] = range[pz<<1] + range[(pz<<1)|1];
}
void Querry(int li,int lf,int pz)
{
if(A <= li && lf <= B)
{
answer += range[pz];
return;
}
int m = li+((lf-li)>>1);
if(A <= m)
Querry(li,m,pz<<1);
if(B > m)
Querry(m+1,lf,(pz<<1)|1);
}
};
SegmentTree aint;
void Read()
{
scan(N,1);
scan(M,0);
aint.Build(1,N,1);
}
void Solve()
{
int op;
for(int i = 1; i <= M;++i)
{
scan(op,1);
if(op == 0)
{
scan(ind,1);scan(x,0);
aint.Update(1,N,1);
}
else
{
answer = 0;
scan(A,1);scan(B,0);
aint.Querry(1,N,1);
printf("%d\n",answer);
}
}
}
int main()
{
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
Read();
Solve();
return 0;
}