#include<stdio.h>
#define MAXN 15001
#define DIM 100000
FILE*fin,*fout;
int arbint[4*MAXN];
char buf[DIM];
int pos=0;
inline int left_son(int nod);
inline int right_son(int nod);
void update(int nod,int st,int dr,int poz,int val);
int query(int nod,int st,int dr,int queryst,int querydr);
inline void citire(int& n);
int main()
{
fin=fopen("datorii.in","r");
fout=fopen("datorii.out","w");
int N,M;
citire(N);
citire(M);
for(int i=1; i<=N; i++)
{
int x;
citire(x);
update(1,1,N,i,-x);
}
for(int i=1; i<=M; i++)
{
int type;
int st,dr;
citire(type);
citire(st);
citire(dr);
if(type==0)
{
update(1,1,N,st,dr);
}
if(type==1)
{
fprintf(fout,"%d\n",query(1,1,N,st,dr));
}
}
fclose(fin);
fclose(fout);
return 0;
}
inline int left_son(int nod)
{
return 2*nod;
}
inline int right_son(int nod)
{
return 2*nod+1;
}
void update(int nod,int st,int dr,int poz,int val)
{
if(st==dr)
{
arbint[nod]-=val;
return;
}
int mij=(st+dr)>>1;
if(poz<=mij)
{
update(left_son(nod),st,mij,poz,val);
}
else
{
update(right_son(nod),mij+1,dr,poz,val);
}
arbint[nod]=arbint[left_son(nod)]+arbint[right_son(nod)];
}
int query(int nod,int st,int dr,int queryst,int querydr)
{
if(queryst<=st && dr<=querydr)
{
return arbint[nod];
}
if(queryst>dr || querydr<st)
{
return 0;
}
int mij=(st+dr)>>1;
return query(left_son(nod),st,mij,queryst,querydr)+query(right_son(nod),mij+1,dr,queryst,querydr);
}
inline void citire(int &n)
{
n=0;
while(buf[pos]<'0' || buf[pos]>'9')
{
pos++;
if(pos==DIM)
{
fread(buf,1,DIM,fin);
pos=0;
}
}
while(buf[pos]>='0' && buf[pos]<='9')
{
n=n*10+buf[pos]-'0';
pos++;
if(pos==DIM)
{
fread(buf,1,DIM,fin);
pos=0;
}
}
}