#include <bits/stdc++.h>
using namespace std;
int n;
struct SegTree {
vector<long long> aint;
SegTree(vector<int>& v) {
aint.resize(4 * v.size() + 1);
build(v);
}
long long query(vector<int>& v, int x, int y, int i = 1, int j = n, int idx = 1) {
if (i == x && j == y) {
return aint[idx];
}
int mid = i + (j - i) / 2;
if (y <= mid) {
return query(v, x, y, i, mid, 2 * idx);
}
if (x > mid) {
return query(v, x, y, mid + 1, j, 2 * idx + 1);
}
return query(v, x, mid, i, mid, 2 * idx) +
query(v, mid + 1, y, mid + 1, j, 2 * idx + 1);
}
void update(vector<int>& v, int x, int y, int i = 1, int j = n, int idx = 1) {
if (i == j && j == x) {
aint[idx] = y;
v[i] = y;
return;
}
int mid = i + (j - i) / 2;
if (x <= mid) {
update(v, x, y, i, mid, 2 * idx);
} else {
update(v, x, y, mid + 1, j, 2 * idx + 1);
}
aint[idx] = aint[2 * idx] + aint[2 * idx + 1];
}
private:
void build(vector<int>& v, int i = 1, int j = n, int idx = 1) {
if (i == j) {
aint[idx] = v[i];
return;
}
int mid = i + (j - i) / 2;
build(v, i, mid, 2 * idx);
build(v, mid + 1, j, 2 * idx + 1);
aint[idx] = aint[2 * idx] + aint[2 * idx + 1];
}
};
signed main() {
#ifndef LOCAL
cin.tie(nullptr)->sync_with_stdio(false);
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
#endif
int m; cin >> n >> m;
vector<int> v(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
SegTree aint(v);
while (m--) {
int op, x, y; cin >> op >> x;
if (op < 2)
cin >> y;
if (op == 0)
aint.update(v, x, v[x] + y);
else if (op == 1)
cout << aint.query(v, x, y) << '\n';
else {
int ans = -1, l = 1, r = n;
while (l <= r) {
int mid = l + (r - l) / 2;
if (aint.query(v, 1, mid) == x) {
ans = mid;
break;
}
if (aint.query(v, 1, mid) < x) {
l = mid + 1;
} else {
r = mid - 1;
}
}
cout << ans << '\n';
}
}
return 0;
}