#include <bits/stdc++.h>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
long int tree[60004], elem[15001];
long int nr_elem, nr_query;
long int i, j;
void init_tree(long int poz, long int st, long int dr)
{
if (st == dr)
tree[poz] = elem[st];
else
{
long int middle = (st + dr) / 2;
init_tree(poz * 2, st, middle);
init_tree(poz * 2 + 1, middle + 1, dr);
tree[poz] = tree[poz * 2] + tree[poz * 2 + 1];
}
}
void update(long int poz, long int st, long int dr, long int val, long int poz_val)
{
if (st == dr)
tree[poz] = max((long)0, tree[poz] - val);
else
{
long int middle = (st + dr) / 2;
if (poz_val <= middle)
update(poz * 2, st, middle, val, poz_val);
else
update(poz * 2 + 1, middle + 1, dr, val, poz_val);
tree[poz] = tree[poz * 2] + tree[poz * 2 + 1];
}
}
long int query(long int poz, long int st, long int dr, long int st_q, long int dr_q)
{
if (st_q <= st && dr <= dr_q)
return tree[poz];
else
{
long int middle = (st + dr) / 2;
if (st_q >= middle + 1)
return query(poz * 2 + 1, middle + 1, dr, st_q, dr_q);
else if (dr_q <= middle)
return query(poz * 2, st, middle, st_q, dr_q);
else
return query(poz * 2, st, middle, st_q, dr_q) + query(poz * 2 + 1, middle + 1, dr, st_q, dr_q);
}
return 0;
}
int main()
{
fin >> nr_elem >> nr_query;
for (i = 1; i <= nr_elem; i++)
fin >> elem[i];
init_tree(1, 1, nr_elem);
long int tip, a, b;
for (i = 1; i <= nr_query; i++)
{
fin >> tip >> a >> b;
if (tip == 1)
fout << query(1, 1, nr_elem, a, b) << "\n";
else
update(1, 1, nr_elem, b, a);
}
return 0;
}