# include <fstream>
using namespace std;
ifstream f ("datorii.in");
ofstream g ("datorii.out");
int n, st, dr, i, m, H[300010], v[100003];
inline int maxim (int a, int b){
if (a > b) return a;
return b;
}
inline void update (int st, int dr, int node, int val, int poz){
if (st >= dr){
H[node] -= val;
return ;
}
int m = (st + dr) >> 1;
if (poz <= m)
update (st, m, node << 1, val, poz);
else
update (m + 1, dr, (node << 1) + 1, val, poz);
H[node] -= val;//H[node] = H[node << 1] + H[(node << 1) + 1];
}
inline void update2 (int st, int dr, int node, int val, int poz){
if (st >= dr){
H[node] += val;
return ;
}
int m = (st + dr) >> 1;
if (poz <= m)
update2 (st, m, node << 1, val, poz);
else
update2 (m + 1, dr, (node << 1) + 1, val, poz);
H[node] = H[node << 1] + H[(node << 1) + 1];
}
inline int query (int st, int dr, int i, int j, int node){
if (i <= st && dr <= j) return H[node];
int m = (st + dr) >> 1, sol = 0;
if (i <= m) sol = sol + query (st, m, i, j, node << 1);
if (m < j) sol = sol + query (m + 1, dr, i, j, (node << 1) + 1);
return sol;
}
int Q;
int main (){
f >> n >> m;
for (i = 1; i <= n; ++i){
f >> v[i];
update2 (1, n, 1, v[i], i);
}
for (; m > 0; --m){
f >> Q >> st >> dr;
if (Q)
g << query (1, n, st, dr, 1) << '\n';
else
update (1, n, 1, dr, st);
}
return 0;
}