#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void update (int *aib,int x,int y,int n)
{
int ind=x;
for (;ind<=n;ind+=ind^(ind&(ind-1))) aib[ind]+=y;
}
int query (int *aib,int st,int dr)
{
int sum1=0,sum2=0,ind;
ind=dr;
while (ind>0)
{
sum1+=aib[ind];
ind-=ind^(ind&(ind-1));
}
ind=st-1;
while (ind>0)
{
sum2+=aib[ind];
ind-=ind^(ind&(ind-1));
}
return sum1-sum2;
}
int query2 (int *aib,int x,int n)
{
int step,cnt;
for (step=1;step<n;step<<=1);
for (cnt=1;step;step>>=1)
{
if (cnt+step<=n)
if (query(aib,1,cnt+step)<=x)
cnt+=step;
}
if (query(aib,1,cnt)==x)
return cnt;
else
return -1;
}
int main()
{
FILE *fin,*fout;
fin=fopen("aib.in","r");
fout=fopen("aib.out","w");
int *aib,n,i,m,cmd,x,y,st,dr;
fscanf(fin,"%d %d",&n,&m);
aib=(int *)malloc(sizeof(int)*(n+1));
memset(aib,'\0',sizeof(int)*(n+1));
for (i=1;i<=n;i++)
{
fscanf(fin,"%d",&x);
update(aib,i,x,n);
}
for (i=0;i<m;i++)
{
fscanf(fin,"%d",&cmd);
switch (cmd)
{
case 0:
fscanf(fin,"%d %d",&x,&y);
update(aib,x,y,n);
break;
case 1:
fscanf(fin,"%d %d",&st,&dr);
fprintf(fout,"%d\n",query(aib,st,dr));
break;
case 2:
fscanf(fin,"%d",&x);
fprintf(fout,"%d\n",query2(aib,x,n));
break;
default:break;
}
}
fclose(fin);
fclose(fout);
return 0;
}