#include<algorithm>
#include<cstdio>
using namespace std;
#define Nmax 100005
int Arb[Nmax*2]={0}, N, Q, pos, val, start, finish, suma=0;
void Update(int,int,int);
void Query(int,int,int);
int main ()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d\n",&N,&Q);
int x, A, B;
for(int i=1;i<=N;i++)
{
scanf("%d ",&x);
pos=i; val=x;
Update(1,1,N);
}
for(int i=1; i<=Q; i++)
{
scanf("%d ",&x);
if(x == 0)
{
scanf("%d %d\n",&A,&B);
pos=A; val=B;
Update(1,1,N);
}
if(x == 1)
{
scanf("%d %d\n",&A,&B);
start=A; finish=B; suma=0;
Query(1,1,N);
printf("%d\n",suma);
}
if(x == 2)
{
scanf("%d\n",&A);
}
}
/*for(int i=1;i<=2*N;i++)
printf("%d ",Arb[i]);
printf("%f ",(float)sizeof(Arb)/(1024*1024));*/
}
void Update(int nod, int left, int right)
{
if(left == right)
{
Arb[nod]+= val;
return;
}
int mijl = (right+left)/2;
if( pos <= mijl ) Update (nod*2, left, mijl);
else Update (nod*2+1,mijl+1, right);
Arb[nod]=Arb[nod*2]+Arb[nod*2+1];
}
void Query(int nod, int left, int right)
{
if(start<= left && right<=finish)
{
suma+=Arb[nod];
return;
}
int mijl= (right + left)/2;
if( start <= mijl) Query(nod*2, left, mijl);
if( mijl < finish) Query(nod*2+1,mijl+1, right);
}