#include <fstream>
#define VAL 100005
#define INTR 200005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N, M, i, j, poz, op, a, b;
unsigned int v, aint[INTR];
long long x;
long long sum;
void actualizare(int nod, int st, int dr, int poz, int val)
{
if (st==poz && poz==dr)
aint[nod]+=val;
else
{
int mij=(st+dr) / 2;
if (poz<=mij)
actualizare(2*nod, st, mij, poz, val);
else
actualizare(2*nod+1, mij+1, dr, poz, val);
aint[nod]=aint[2*nod]+aint[2*nod+1];
}
}
void solve1(int nod, int st, int dr, int a, int b)
{
if (a<=st && dr<=b)
sum+=aint[nod];
else
{
int mij=(st+dr) / 2;
if (mij>=a)
solve1(2*nod, st, mij, a, b);
if (mij+1<=b)
solve1(2*nod+1, mij+1, dr, a, b);
}
}
void solve2(int nod, int st, int dr, long long a)
{
int mij=(st+dr) / 2;
if (st==dr)
{
if (sum+aint[nod]==a)
poz=st;
else
poz=-1;
sum+=aint[nod];
}
if (poz==0)
{
if (sum+aint[2*nod]<a)
{
sum+=aint[2*nod];
solve2(2*nod+1, mij+1, dr, a);
}
else
solve2(2*nod, st, mij, a);
}
}
int main()
{
fin >> N >> M;
for (i=1; i<=N; i++)
{
fin >> v;
actualizare(1, 1, N, i, v);
}
for (i=1; i<=M; i++)
{
fin >> op;
if (op<2)
fin >> a >> b;
else
fin >> x;
if (op==0)
actualizare(1, 1, N, a, b);
if (op==1)
{
sum=0;
solve1(1, 1, N, a, b);
fout << sum << '\n';
}
if (op==2)
{
sum=poz=0;
if (aint[1]==x)
poz=N;
else
solve2(1, 1, N, x);
fout << poz << '\n';
}
}
fin.close();
fout.close();
return 0;
}