#include <bits/stdc++.h>
using namespace std;
ifstream fin("di.in");
ofstream fout("di.out");
int tree[400004], elem[100001];
int nr_elem, nr_query;
int i, j;
void init_tree(int poz, int st, int dr)
{
if (st == dr)
tree[poz] = elem[st];
else
{
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(int poz, int st, int dr, int val, int poz_val)
{
if (st == dr)
tree[poz] = max(0, tree[poz] - val);
else
{
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];
}
}
int query(int poz, int st, int dr, int st_q, int dr_q)
{
if (st_q <= st && dr <= dr_q)
return tree[poz];
else
{
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);
}
}
int main()
{
fin >> nr_elem >> nr_query;
for (i = 1; i <= nr_elem; i++)
fin >> elem[i];
init_tree(1, 1, nr_elem);
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;
}