#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 sum (int *aib,int dr)
{
int sum=0,ind=dr;
for (;ind;ind-=ind^(ind&(ind-1))) sum+=aib[ind];
return sum;
}
int query (int *aib,int st,int dr)
{
return sum(aib,dr)-sum(aib,st-1);
}
int search (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 (sum(aib,cnt+step)<=x)
cnt+=step;
}
if (sum(aib,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",search(aib,x,n));
break;
default:break;
}
}
fclose(fout);
return 0;
}