#include <fstream>
#include <vector>
using namespace std;
void actualizare(vector <int> &aib, int poz, int val) {
int n = (int)aib.size() - 1;
while (poz <= n) {
aib[poz] += val;
int p2 = (poz & (-poz));
poz += p2;
}
}
int interogare(vector <int> &aib, int poz) {
int suma = 0;
while (poz != 0) {
suma += aib[poz];
int p2 = (poz & (-poz));
poz -= p2;
}
return suma;
}
int interogare_poz_min(vector <int> &aib, int val) {
// cautam cea mai mare pozitie i pentru care suma v[1]+..+v[i] < val
int n = (int)aib.size() - 1, copie_val = val;
int p2 = 1;
while (p2 <= n / 2) {
p2 *= 2;
}
int poz = 0;
while (p2 != 0) {
if (poz + p2 <= n && aib[poz+p2] < val) {
val -= aib[poz+p2];
poz += p2;
}
p2 /= 2;
}
if (poz < n && interogare(aib, poz + 1) == copie_val) {
return poz + 1;
}
return -1;
}
int main() {
ifstream fin("aib.in");
int n, q;
fin >> n >> q;
vector <int> aib(n + 1, 0);
for (int i = 0; i < n; i++) {
int val;
fin >> val;
actualizare(aib, i + 1, val);
}
ofstream fout("aib.out");
for (int i = 0; i < q; i++) {
int tip;
fin >> tip;
if (tip == 0) {
int poz, val;
fin >> poz >> val;
actualizare(aib, poz, val);
} else if (tip == 1) {
int a, b;
fin >> a >> b;
fout << interogare(aib, b) - interogare(aib, a - 1) << "\n";
} else {
int val;
fin >> val;
fout << interogare_poz_min(aib, val) << "\n";
}
}
fin.close();
fout.close();
return 0;
}