#include <cstdio>
#define NMAX 100001
using namespace std;
FILE* fin=fopen("aib.in","r");
FILE* fout=fopen("aib.out","w");
int n,m,a[NMAX],s[NMAX];
void citire();
void update(int poz,int val);
int query(int p);
int cauta(int x);
int main()
{
int i,q,A,b;
citire();
for (i=1; i<=m; i++)
{
fscanf(fin,"%d",&q);
if (q==0)
{
fscanf(fin,"%d %d",&A,&b);
update(A,b);
continue;
}
if (q==1)
{
fscanf(fin,"%d %d",&A,&b);
fprintf(fout,"%d\n",query(b)-query(A-1));
continue;
}
if (q==2)
{
fscanf(fin,"%d",&A);
fprintf(fout,"%d\n",cauta(A));
/*gasit=0;
for (k=1; k<=n; k++)
{
x=query(k);
if(x==A)
{fprintf(fout,"%d\n",k);
gasit=1;
break;}
if (x>A) break;
}
if (!gasit) fprintf(fout,"-1\n");*/
continue;
}
}
return 0;
}
void citire()
{
int i,x;
fscanf(fin,"%d %d",&n,&m);
for (i=1; i<=n; i++)
{fscanf(fin,"%d",&x);
update(i,x);}
}
void update(int poz,int val)
{
int i;
for (i=poz; i<=n; i= i+ ( (i^ (i-1) ) & i ))
s[i]+=val;
}
int query(int p)
{
int sum=0,i;
for (i=p; i>0 ; i= i-( (i^ (i-1) ) & i ))
sum+=s[i];
return sum;
}
int cauta(int x)
{
int st=1,dr=n,mijl,val;
while (st<=dr)
{
mijl=(st+dr)/2;
val=query(mijl);
if (val==x) return mijl;
else
{
if (val>x) dr=mijl-1;
else st=mijl+1;
}
}
return -1;
}