#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <cmath>
using namespace std;
#define Inf 0x3f3f3f3f
ifstream cin("datorii.in");
ofstream cout("datorii.out");
int n,q,op,x,y;
int a[15005];
int aint[100005];
void buildtree(int nod,int st,int dr){
if(st == dr){
aint[nod] = a[st];
return;
}
int mij = (st + dr) / 2;
buildtree(nod * 2,st,mij);
buildtree(nod * 2 + 1, mij + 1, dr);
aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}
void update(int nod,int st,int dr,int pos){
if(st == dr){
aint[nod] = a[st];
return;
}
int mij = (st + dr) / 2;
if(pos <= mij)
update(nod * 2,st,mij,pos);
else
update(nod * 2 + 1,mij + 1,dr, pos);
aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}
int query(int nod,int st,int dr,int x,int y){
if(x <= st && dr <= y)
return aint[nod];
int mij = (st + dr) / 2;
int queryst = 0,querydr = 0;
if(x <= mij)
queryst = query(nod * 2, st,mij,x,y);
if(mij < y)
querydr = query(nod * 2 + 1,mij + 1,dr,x,y);
return queryst + querydr;
}
int main(){
cin >> n >> q;
for(int i = 1 ; i <= n ; ++i)
cin >> a[i];
buildtree(1,1,n);
for(int i = 1 ; i <= q ; ++i){
cin >> op >> x >> y;
if(op == 0){
a[x] -= y;
update(1,1,n,x);
}
else
cout << query(1,1,n,x,y) << '\n';
}
return 0;
}