#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int MAXN = 15000;
const int MAXA = MAXN * 2;
int a[MAXA];
int v[MAXN];
void contructArbore( int left, int right, int nodeIndex ){
if( left == right ){
a[nodeIndex] = v[left];
return;
}
int mid, leftChild, rightChild;
mid = ( right + left ) / 2;
leftChild = nodeIndex + 1;
rightChild = nodeIndex + ( mid + left + 1 ) * 2;
contructArbore(left, mid, leftChild);
contructArbore(mid + 1, right, rightChild);
a[nodeIndex] = a[leftChild] + a[rightChild];
}
void update( int nodeIndex, int left, int right, int poz, int val ){
if( left == right ){
a[nodeIndex] -= val;
return;
}
int mid, leftChild, rightChild;
mid = ( left + right ) / 2;
leftChild = nodeIndex + 1;
rightChild = nodeIndex + ( mid + left + 1 ) * 2;
if( poz <= mid )
update( leftChild, left, mid, poz, val );
else
update( rightChild, mid + 1, right, poz, val );
a[nodeIndex] = a[leftChild] + a[rightChild];
}
int query( int nodeIndex, int left, int right, int index1, int index2 ){
if( left >= index1 && index2 >= right ){
return a[nodeIndex];
}
int mid, leftChild, rightChild;
mid = ( left + right ) / 2;
leftChild = nodeIndex + 1;
rightChild = nodeIndex + ( mid + left + 1 ) * 2;
int sum;
sum = 0;
if( index1 <= mid )
sum += query(leftChild, left, mid, index1, index2);
if( index2 > mid )
sum += query(rightChild, mid + 1, right, index1, index2);
return sum;
}
int main(){
int n, m, i, c, a, b;
in>>n>>m;
for( i = 0; i < n; i++ ){
in>>v[i];
}
contructArbore(0, n - 1, 0);
for( i = 0; i < m; i++ ){
in>>c>>a>>b;
if( c == 0 ){
update(0, 0, n - 1, a - 1, b);
}
else{
out<<query(0, 0, n - 1, a - 1, b - 1)<<'\n';
}
}
return 0;
}