#include <bits/stdc++.h>
#define MAXN (1024 * 128)
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[MAXN + 1];
int lsb(int x) {//lowest significant bit
return x & (-x);
}
void update(int n, int poz, int val) {
while (poz <= n) {
aib[poz] += val;
poz += lsb(poz);
}
}
int query(int poz) {
int rez = 0;
while (poz > 0) {
rez += aib[poz];
poz -= lsb(poz);
}
return rez;
}
int main() {
int n, m, i, t, a, b, nr, put2, mask, sum, max_bit, bit;
cin >> n >> m;
for (i = 1; i <= n; i++) {
cin >> nr;
update(n, i, nr);
}
put2 = 1;
max_bit = 0;
while (put2 * 2 <= n) {
put2 *= 2;
max_bit++;
}
//printf("max_bit = %d\n", max_bit);
for (i = 1; i <= m; i++) {
cin >> t;
if (t == 0) {
cin >> a >> b;
update(n, a, b);
}else if (t == 1) {
cin >> a >> b;
cout << query(b) - query(a - 1) << "\n";
}else {
cin >> a;
mask = sum = 0;
for (bit = max_bit; bit >= 0; bit--) {
//printf("sum + aib = %d, ind = %d\n", sum + aib[mask | (1 << bit)], mask | (1 << bit));
if ((mask | (1 << bit)) <= n && sum + aib[mask | (1 << bit)] <= a) {
mask |= (1 << bit);
sum += aib[mask];
}
}
if (sum != a) {
cout << "-1\n";
}else {
cout << mask << "\n";
}
}
}
return 0;
}