#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string np = "aib";
ifstream f(np + ".in");
ofstream g(np + ".out");
// #define f cin
// #define g cout
int n, m;
struct segtree
{
int size = 1;
vector<int> val;
void init(int n)
{
while (size < n)
size *= 2;
val.resize(size * 2);
}
void build(vector<int> &aux, int nod, int stnod, int drnod)
{
if (drnod - stnod == 1)
{
if (stnod < (int)aux.size())
val[nod] = aux[stnod];
return;
}
int mid = (stnod + drnod) / 2;
build(aux, nod * 2 + 1, stnod, mid);
build(aux, nod * 2 + 2, mid, drnod);
val[nod] = val[nod * 2 + 1] + val[nod * 2 + 2];
}
void build(vector<int> &aux)
{
build(aux, 0, 0, size);
}
void set(int poz, int valoare, int nod, int stnod, int drnod)
{
if (drnod - stnod == 1)
{
val[nod] += valoare;
return;
}
int mid = (stnod + drnod) / 2;
if (poz < mid)
set(poz, valoare, nod * 2 + 1, stnod, mid);
else
set(poz, valoare, nod * 2 + 2, mid, drnod);
val[nod] = val[nod * 2 + 1] + val[nod * 2 + 2];
}
void set(int poz, int val)
{
set(poz, val, 0, 0, size);
}
ll suma(int st, int dr, int nod, int stnod, int drnod)
{
if (stnod >= dr or drnod <= st)
return 0;
if (stnod >= st and drnod <= dr)
return val[nod];
int mid = (stnod + drnod) / 2;
int s1 = suma(st, dr, nod * 2 + 1, stnod, mid);
int s2 = suma(st, dr, nod * 2 + 2, mid, drnod);
return s1 + s2;
}
ll suma(int st, int dr)
{
return suma(st, dr, 0, 0, size);
}
ll minimk(int a)
{
for (int i = 1; i <= n; i++)
if (suma(0, i) == a)
return i;
return -1;
}
} mst;
int main()
{
f >> n >> m;
mst.init(n);
vector<int> aux(n);
for (int i = 0; i < n; i++)
f >> aux[i];
mst.build(aux);
for (int cer; f >> cer;)
if (cer == 0)
{
int poz, val;
f >> poz >> val;
mst.set(poz - 1, val);
}
else if (cer == 1)
{
int st, dr;
f >> st >> dr;
g << mst.suma(st - 1, dr) << '\n';
}
else
{
int a;
f >> a;
g << mst.minimk(a) << '\n';
}
return 0;
}