#include <iostream>
#include <fstream>
using namespace std;
FILE* fin=fopen("aib.in","r");
ofstream fout("aib.out");
const unsigned maxb=100192;
char buf[maxb];
unsigned ptr=maxb;
inline unsigned getInt(){
unsigned nr=0;
while(buf[ptr]<'0'||'9'<buf[ptr])
if(++ptr>=maxb)
fread(buf,maxb,1,fin),ptr=0;
while('0'<=buf[ptr]&&buf[ptr]<='9'){
nr=nr*10+buf[ptr]-'0';
if(++ptr>=maxb)
fread(buf,maxb,1,fin),ptr=0;
}
return nr;
}
int n, m;
int arb[400100];
void update(int nod, int st, int dr, int pos, int value) {
if (st == dr) {
arb[nod] += value;
return;
}
int mij = (st + dr) / 2;
if (pos <= mij)
update(2 * nod, st, mij, pos, value);
else
update(2 * nod + 1, mij + 1, dr, pos, value);
arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}
long long ask(int nod, int st, int dr, int a, int b) {
if (a <= st && dr <= b)
return arb[nod];
int mij = (st + dr) / 2;
long long sol = 0;
if (a <= mij)
sol += ask(2 * nod, st, mij, a, b);
if (b > mij)
sol += ask(2 * nod + 1, mij + 1, dr, a, b);
return sol;
}
int cautaBinar(int suma) {
int st = 1, dr = n;
while (st < dr) {
int mij = (st + dr) / 2;
if (ask(1, 1, n, 1, mij) < suma)
st = mij + 1;
else
dr = mij;
}
if (ask(1, 1, n, 1, st) == suma)
return st;
return -1;
}
int main() {
n = getInt();
m = getInt();
for (int i = 1; i <= n; i++) {
int nr = getInt();
update(1, 1, n, i, nr);
}
for (int i = 1; i <= m; i++) {
int c = getInt();
if (c == 0) {
int a = getInt();
int b = getInt();
update(1, 1, n, a, b);
} else if (c == 1) {
int a = getInt();
int b = getInt();
fout << ask(1, 1, n, a, b) << '\n';
} else {
int a = getInt();
fout << cautaBinar(a) << '\n';
}
}
return 0;
}