#include <cstdio>
using namespace std;
void update(int poz, int x, int arb[], int n) {
int c =0;
while(poz<=n) {
arb[poz] += x;
while( ! (poz & (1<<c))) ++c;
poz += (1<<c);
++c;
}
}
int query(int poz, int arb[], int n) {
int s = 0, c = 0;
while(poz > 0) {
s+= arb[poz];
while (! (poz & (1<<c))) ++c;
poz -= (1<<c);
++c;
}
return s;
}
int searchval(int x, int arb[], int n) {
int step = 1;
while (step < n) step *= 2;
for(int i=0; step; step /= 2) {
if (i + step <=n && x >= arb[i+step]) {
x -= arb[i+step];
i += step;
if (x == 0)
return i;
}
}
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int n, m, x, y, t;
scanf("%d%d", &n, &m);
int arb[n+1];
for(int i=0; i<=n; ++i)
arb[i] = 0;
for(int i=1; i<=n; ++i) {
scanf("%d",&x);
update(i, x, arb, n);
}
for(int i=1; i<=m; ++i) {
scanf("%d", &t);
switch(t) {
case 0:
scanf("%d%d", &x, &y);
update(x, y, arb, n);
break;
case 1:
scanf("%d%d", &x, &y);
printf("%d\n", query(y, arb, n) - query(x-1, arb, n));
break;
case 2:
scanf("%d", &x);
printf("%d\n", searchval(x, arb, n));
break;
}
}
return 0;
}