#include <stdio.h>
int s,N,M,val,poz,start,finish,zi,minus,Arb[35000];
void update(int nod, int left, int right)
{
if( left == right )
{
Arb[nod] = val;
return;
}
int div = (left + right)/2;
if(poz <= div) update(2*nod,left,div);
else update(2*nod+1,div+1,right);
Arb[nod] = Arb[2*nod] + Arb[2*nod+1];
}
void update2(int nod, int left, int right)
{
if( left == right )
{
Arb[nod] -= minus;
return;
}
int div = (left + right)/2;
if(zi <= div) update2(2*nod,left,div);
else update2(2*nod+1,div+1,right);
Arb[nod] -= minus;
}
void query(int nod, int left, int right)
{
if ( start <= left && finish >= right )
{
s += Arb[nod];
return;
}
int div = (left + right)/2;
if(start <= div ) query(2*nod,left,div);
if(finish > div) query(2*nod+1,div+1,right);
}
int main()
{
int x,a,b;
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1; i<=N; ++i)
{
scanf("%d",&x);
poz = i;
val = x;
update(1,1,N);
}
for(int i=1; i<=M; ++i)
{
scanf("%d%d%d",&x,&a,&b);
if(x == 1)
{
s = 0;
start = a;
finish = b;
query(1,1,N);
printf("%d\n",s);
}
else
{
zi = a;
minus = b;
update2(1,1,N);
}
}
}