#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int MAXN = 100005;
int n, m, v[4*MAXN], x;
int tip, a, b;
void update(int nod, int poz, int st, int dr, int val) {
if (st == dr) {
v[nod] += val;
return;
}
int m = (st + dr) / 2;
if (poz <= m) {
update(nod * 2, poz, st, m, val);
} else {
update(nod * 2 + 1, poz, m + 1, dr, val);
}
v[nod] = v[nod * 2] + v[nod * 2 + 1];
}
int sum(int nod, int st, int dr, int qst, int qdr) {
if (qst > dr || qdr < st) {
return 0;
}
if (qst <= st && dr <= qdr) {
return v[nod];
}
int m = (st + dr) / 2;
int s1 = sum(nod * 2, st, m, qst, qdr);
int s2 = sum(nod * 2 + 1, m + 1, dr, qst, qdr);
return s1 + s2;
}
int findK(int a) {
int left = 1, right = n, result = -1;
while (left <= right) {
int mid = (left + right) / 2;
int currentSum = sum(1, 1, n, 1, mid);
if (currentSum == a) {
result = mid;
break;
} else if (currentSum < a) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return result;
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
fin >> x;
update(1, i, 1, n, x);
}
for (int i = 1; i <= m; ++i) {
fin >> tip;
if (tip!=2){
fin >> a >> b;
}
else {
fin >> a;
}
if (tip == 0) {
update(1, a, 1, n, b);
}
else if (tip == 1) {
fout << sum(1, 1, n, a, b) << '\n';
}
else if (tip==2){
fout << findK(a) << '\n';
}
}
return 0;
}