#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define NMAX 200005
#define ZERO(x) ((x^(x-1))&x)
using namespace std;
typedef long long ll;
int aib[100005], n, q, i, j, x, y, tip;
FILE *fin=fopen("aib.in","r");
FILE *fout=fopen("aib.out","w");
void upd(ll p, ll x)
{
for(int i=p;i<=n;i+=ZERO(i))
aib[i]+=x;
}
ll query(ll p)
{
ll ans=0;
while(p)
{
ans+=aib[p];
p-=ZERO(p);
}
return ans;
}
ll ok(ll m, ll key)
{
return query(m)<=key;
}
ll cautbin(ll l, ll key, ll r)
{
while(l!=r)
{
ll m=(l+r+1)/2;
if(ok(m,key))
l=m;
else r=m-1;
}
return l;
}
int main()
{
// fast();
fscanf(fin,"%d%d",&n,&q);
for(i=1;i<=n;i++)
{
fscanf(fin,"%d",&x);
upd(i,x);
}
//for(i=1;i<=n;i++)
// cout<<aib[i]<<' ';
while(q)
{
q--;
fscanf(fin,"%d",&tip);
if(tip==0)
{
fscanf(fin,"%d%d",&i,&x);
upd(i,x);
}
else if(tip==1)
{
fscanf(fin,"%d%d",&x,&y);
fprintf(fout,"%d\n",query(y)-query(x-1));
}
else
{
fscanf(fin,"%d",&x);
if(query(cautbin(1,x,n))==x)
fprintf(fout,"%d\n",cautbin(1,x,n));
else fprintf(fout,"-1\n");
}
}
return 0;
}