#include <bits/stdc++.h>
std::ifstream in("aib.in");
std::ofstream out("aib.out");
class BIT {
private:
int n;
int lg;
std::vector<int> bit;
int lsb(int x) {
return x & (-x);
}
public:
BIT(int n) {
bit.resize(n + 1, 0);
this -> n = n;
lg = (int)log2(n + 1) + 1;
}
void update(int u, int val) {
while (u <= n) {
bit[u] += val;
u += lsb(u);
}
}
int query(int u) {
int result = 0;
while (u > 0) {
result += bit[u];
u -= lsb(u);
}
return result;
}
int lift(int u) {
int result = 0;
for (int step = (1 << lg); step > 0 && u > 0; step >>= 1) {
if ((result + step) <= n && bit[result + step] <= u) {
result += step;
u -= bit[result];
if (u == 0) {
return result;
}
}
}
return -1;
}
};
int n, m;
int main() {
in >> n >> m;
BIT ds(n);
for (int i = 1; i <= n; i++) {
int x;
in >> x;
ds.update(i, x);
}
for (int i = 1; i <= m; i++) {
int op, x, y;
in >> op >> x;
if (op == 0) {
in >> y;
ds.update(x, y);
} else if (op == 1) {
in >> y;
out << ds.query(y) - ds.query(x - 1) << "\n";
} else if (op == 2) {
out << ds.lift(x) << "\n";
}
}
return 0;
}