#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int MAXN = 131078;
int n, q;
int v[MAXN * 2];
int a[MAXN];
inline int parent(int nod) {
return nod / 2;
}
inline int leftChild(int nod) {
return nod * 2;
}
inline int rightChild(int nod) {
return nod * 2 + 1;
}
inline void calculate(int nod) {
v[nod] = v[leftChild(nod)] + v[rightChild(nod)];
}
void build(int nod, int st, int dr) {
if (st == dr) {
v[nod] = a[st];
}
else {
int mid = (st + dr) / 2;
build(leftChild(nod), st, mid);
build(rightChild(nod), mid + 1, dr);
calculate(nod);
}
}
void update(int nod, int st, int dr, int poz, int val) {
if (st == dr) {
v[nod] += val;
}
else {
int mid = (st + dr) / 2;
if (poz <= mid) {
update(leftChild(nod), st, mid, poz, val);
}
else {
update(rightChild(nod), mid + 1, dr, poz, val);
}
calculate(nod);
}
}
int sum(int nod, int st, int dr, int x, int y) {
if (x <= st && dr <= y) {
return v[nod];
}
else {
int mid = (st + dr) / 2;
int s = 0;
if (x <= mid) {
s += sum(leftChild(nod), st, mid, x, y);
}
if (y >= mid + 1) {
s += sum(rightChild(nod), mid + 1, dr, x, y);
}
return s;
}
}
int sum2(int s) {
int st = 1;
int dr = n * 2 - 1;
while (st <= dr) {
int mid = (st + dr) / 2;
int sm = sum(1, 1, n, 1, mid);
if (sm == s) {
return mid;
}
else if (sm < s) {
st = mid + 1;
}
else {
dr = mid - 1;
}
}
return -1;
}
inline void afis() {
for (int i = 1; i <= 2 * n - 1; ++i) {
fout << v[i] << ' ';
}
fout << '\n';
}
int main() {
fin >> n >> q;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
build(1, 1, n);
for (int i = 1; i <= q; ++i) {
int t, a, b;
fin >> t;
if (t == 0) {
fin >> a >> b;
update(1, 1, n, a, b);
}
else if (t == 1) {
fin >> a >> b;
fout << sum(1, 1, n, a, b) << '\n';
}
else {
fin >> a;
fout << sum2(a) << '\n';
}
}
fout.close();
return 0;
}