#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aint[400001],i,b,a,poz,n,m,c;
void update(int in,int sf,int nod)
{
if(in==sf)
{
aint[nod]=aint[nod]+b;
return;
}
int mij=(in+sf)/2;
if(mij<poz)
{
update(mij+1,sf,2*nod+1);
}
else
{
update(in,mij,2*nod);
}
aint[nod]=aint[2*nod]+aint[2*nod+1];
}
int cauta(int in,int sf,int in2,int sf2,int nod)
{
if(in==in2 && sf==sf2)
{
return aint[nod];
}
int mij=(in+sf)/2;
if(mij<in2)
{
return cauta(mij+1,sf,in2,sf2,2*nod+1);
}
else if(mij>=sf2)
{
return cauta(in,mij,in2,sf2,2*nod);
}
else if(mij<=sf && mij>=in)
{
return cauta(in,mij,in2,mij,2*nod)+cauta(mij+1,sf,mij+1,sf2,2*nod+1);
}
}
int cauta2(int in,int sf,int nod)
{
if(in==sf && aint[nod]==a)
{
return in;
}
else if(in==sf)
{
return -1;
}
int mij=(in+sf)/2;
if(aint[2*nod]<a)
{
a-=aint[2*nod];
return cauta2(mij+1,sf,2*nod+1);
}
else
{
return cauta2(in,mij,2*nod);
}
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>a;
b=a;
poz=i;
update(1,n,1);
}
while(m--)
{
f>>c;
if(c==0)
{
f>>a>>b;
poz=a;
update(1,n,1);
}
else if(c==1)
{
f>>a>>b;
g<<cauta(1,n,a,b,1)<<'\n';
}
else
{
f>>a;
g<<cauta2(1,n,1)<<'\n';
}
}
return 0;
}