#include <cstdio>
using namespace std;
const int NMAX = 200000;
const char Input[]="aib.in";
const char Output[]="aib.out";
int arbSum[NMAX];
int pos,val,start,final,sum=0,k,n,m;
inline void update(int node,int left,int right)
{
int center;
if(left==right)
{
arbSum[node]+=val;
return ;
}
center=(left+right)/2;
if(pos<=center && 2*node<NMAX )
update(2*node,left,center);
else
if(center<pos && 2*node+1<NMAX)
update(2*node+1,center+1,right);
if(2*node<NMAX)
arbSum[node]=arbSum[2*node];
if(2*node+1<NMAX)
arbSum[node]+=arbSum[2*node+1];
}
inline void query(int node,int left,int right)
{
int center;
if(start<=left && right<=final && node < NMAX)
{
sum+=arbSum[node];
return;
}
center=(left+right)/2;
if(start<=center && node<<1 < NMAX)
query(2*node,left,center);
if(center<final && node<<1+1 <NMAX)
query(2*node+1,center+1,right);
}
inline int cauta(int k)
{
sum=0;
start=1,final=n;
int li=1,ls=n,center;
while(li<=ls)
{
center=(li+ls)/2;
sum=0;
final=center;
query(1,1,n);
if(sum>k)
ls=center-1;
if(sum<k)
li=center+1;
if(sum==k)
return center;
}
return -1;
}
int main()
{
freopen (Input,"r",stdin);
freopen (Output,"w",stdout);
scanf("%d %d",&n,&m);
int i,tip,a,b;
for(i=1;i<=n;i++)
{
scanf("%d",&val);
pos=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
scanf("%d",&tip);
switch(tip)
{
case 0:scanf("%d %d",&pos,&val);update(1,1,n);break;
case 1:scanf("%d %d",&start,&final);sum=0;query(1,1,n);printf("%d\n",sum);break;
case 2:scanf("%d",&k);printf("%d\n",cauta(k));break;
}
}
return 0;
}