#include <fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
const int N_MAX = 15e3;
const int SEGMENT_TREE_DIM = 2 * N_MAX;
template<typename T>
class SegmentTree{
private:
T segmentTree[SEGMENT_TREE_DIM];
public:
void build(int node, int left, int right, ifstream& fin){
if(left == right){
T x;
fin >> x;
segmentTree[node] = x;
}else{
int middle = (left + right) / 2;
int leftChild = node + 1;
int rightChild = node + 2 * (middle - left + 1);
build(leftChild, left, middle, fin);
build(rightChild, middle + 1, right, fin);
segmentTree[node] = segmentTree[leftChild] + segmentTree[rightChild];
}
}
void update(int node, int left, int right, int pos, T val){
if(left == right)
segmentTree[node] += val;
else{
int middle = (left + right) / 2;
int leftChild = node + 1;
int rightChild = node + 2 * (middle - left + 1);
if(pos <= middle)
update(leftChild, left, middle, pos, val);
else
update(rightChild, middle + 1, right, pos, val);
segmentTree[node] = segmentTree[leftChild] + segmentTree[rightChild];
}
}
T query(int node, int left, int right, int qleft, int qright){
T retval{};
if(left >= qleft && right <= qright)
retval = segmentTree[node];
else{
int middle = (left + right) / 2;
int leftChild = node + 1;
int rightChild = node + 2 * (middle - left + 1);
if(qleft <= middle)
retval += query(leftChild, left, middle, qleft, qright);
if(middle + 1 <= qright)
retval += query(rightChild, middle + 1, right, qleft, qright);
}
return retval;
}
};
SegmentTree<int> segtree;
int main(){
int n, queries;
fin >> n >> queries;
segtree.build(0, 0, n - 1, fin);
for(int i = 0; i < queries; ++i){
int type, a, b;
fin >> type >> a >> b;
if(type)
fout << segtree.query(0, 0, n - 1, a - 1, b - 1) << '\n';
else
segtree.update(0, 0, n - 1, a - 1, -b);
}
fin.close();
fout.close();
return 0;
}