#include <iostream>
#define NMAX 100000
using namespace std;
int N, M, v[NMAX], T[4 * NMAX], val, pos, Start, End;
void build(int node, int st, int dr) {
if(st == dr) {
T[node] = v[st];
} else {
int mid = (st + dr) / 2;
build(2 * node, st, mid);
build(2 * node + 1, mid + 1, dr);
T[node] = T[2 * node] + T[2 * node + 1];
}
}
void update(int node, int st, int dr) {
if(st == dr) {
T[node] += val;
} else {
int mid = (st + dr) / 2;
if(pos <= mid) {
update(2 * node, st, mid);
} else {
update(2 * node + 1, mid + 1, dr);
}
T[node] = T[2 * node] + T[2 * node + 1];
}
}
void query(int node, int st, int dr) {
if(Start <= st && dr <= End) {
val += T[node];
} else {
int mid = (st + dr) / 2;
if (Start <= mid) {
query(2 * node, st, mid);
}
if (mid + 1 <= End){
query(2 * node + 1, mid + 1, dr);
}
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
cin >> N >> M;
for(int i = 1; i <= N; i++) {
scanf("%d", &v[i]);
}
build(1, 1, N);
int t, a, b;
while(M--) {
scanf("%d", &t);
if(t == 0) {
scanf("%d %d", &a, &b);
val = b;
pos = a;
update(1, 1, N);
} else if (t == 1) {
scanf("%d %d", &a, &b);
Start = a;
End = b;
val = 0;
query(1, 1, N);
printf("%d\n", val);
} else {
scanf("%d", &a);
int st = 1, dr = N, mid, last = -1;
while(st <= dr) {
int mid = (st + dr) / 2;
Start = 1;
End = mid;
val = 0;
query(1, 1, N);
if(a <= val) {
dr = mid - 1;
last = mid;
} else {
st = mid + 1;
}
}
printf("%d\n", last);
}
}
return 0;
}