#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int v[NMAX + 1];
int aint[4 * NMAX + 1];
void build(int node, int st, int dr) {//O(N)
if(st == dr) {
aint[node] = v[st];
} else {
int mid = (st + dr) / 2;
build(2 * node, st, mid);
build(2 * node + 1, mid + 1, dr);
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
}
//O(log N)
void update(int node, int st, int dr, int pos, int val) {
if(st == dr) {
aint[node] += val;
} else {
int mid = (st + dr) / 2;
//[st, mid], [mid + 1, dr]
if(pos <= mid) {
update(2 * node, st, mid, pos, val);
} else {
update(2 * node + 1, mid + 1, dr, pos, val);
}
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
}
int query(int node, int st, int dr, int x, int y) {
if(x <= st && dr <= y) {
return aint[node];
} else {
int mid = (st + dr) / 2;
//[st, mid]
//[mid + 1, dr]
int L = 0, R = 0;
if(x <= mid) {
L = query(2 * node, st, mid, x, y);
}
if(mid + 1 <= y) {
R = query(2 * node + 1, mid + 1, dr, x, y);
}
return L + R;
}
}
int main() {
ifstream cin("aib.in");
ofstream cout("aib.out");
int n, q;
cin >> n >> q;
for(int i = 1; i <= n; i++) {
cin >> v[i];
}
build(1, 1, n);
for(int i = 1; i <= q; i++) {
int op, x, y;
cin >> op >> x;
if(op == 0) {
cin >> y;
update(1, 1, n, x, y);
}
if(op == 1) {
cin >> y;
cout << query(1, 1, n, x, y) << '\n';
}
if(op == 2) {
int st = 1;
int dr = n;
int pos = -1;
while(st <= dr) {
int mid = (st + dr) / 2;
int s = query(1, 1, n, 1, mid);
if(s == x) {
pos = mid;
dr = mid - 1;
} else {
if(s > x) {
dr = mid - 1;
} else {
st = mid + 1;
}
}
}
cout << pos << '\n';
}
}
}