#include <bits/stdc++.h>
const int maxN=100000;
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
struct node{
int val;
};
int vec[maxN];
int putere2(int n)
{
return 1<<(32-__builtin_clz(n-1));
}
int putere2idx(int n)
{
return 32-__builtin_clz(n-1);
}
struct aib{
node v[maxN];
int n;
int Maxpow2,Maxpow2idx;
void init(int lung)
{
n=lung;
Maxpow2=putere2(n);
Maxpow2idx=putere2idx(n);
for(int i=1;i<=n;i++)
{
v[i].val=0;
}
}
void add(int poz,int el)
{
while(poz<=n)
{
v[poz].val+=el;
poz=poz+(poz&(-poz));
}
}
void build()
{
for(int i=1;i<=n;i++)
{
add(i,vec[i]);
}
}
int prefixSum(int poz)
{
int s=0;
while(poz>0)
{
s+=v[poz].val;
poz&=poz-1;
}
return s;
}
int rangeSum(int l, int r)
{
return prefixSum(r)-prefixSum(l-1);
}
int binarSum(int a)
{
int cmp=Maxpow2idx;
cmp=1<<cmp;
int poz=cmp;
while(cmp>0)
{
if(a==v[poz].val and poz<=n)
{
return poz;
}
if(a<v[poz].val || poz>n)
{
cmp/=2;
poz=poz-cmp;
}
else
{
a-=v[poz].val;
cmp/=2;
poz+=cmp;
}
}
return -1;
}
};
aib arbore;
int main()
{
int n,q;
fin>>n>>q;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for(int i=1;i<=n;i++)
{
fin>>vec[i];
}
arbore.init(n);
arbore.build();
for(int i=1;i<=q;i++)
{
int tip;
fin>>tip;
if(tip==0)
{
int poz,val;
fin>>poz>>val;
arbore.add(poz,val);
}
else if(tip==1)
{
int l,r;
fin>>l>>r;
int sum=arbore.rangeSum(l,r);
fout<<sum<<'\n';
}
else
{
int a;
fin>>a;
int k=arbore.binarSum(a);
fout<<k<<'\n';
}
}
return 0;
}