#include <bits/stdc++.h>
#define NMAX 100500
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int tree[NMAX], n;
void update(int poz,int val)
{
for(int i=poz;i<=n;i+=i&(-i))
tree[i]+=val;
}
int query(int poz)
{
int s=0;
for(int i=poz;i>0;i-=i&(-i))
s+=tree[i];
return s;
}
int bin(int val)
{
int st=0;
while(val>0 && tree[st+1]<=val)
{
st++;
while(st+(st&(-st))<=n && tree[st+(st&(-st))]<=val)
st+=(st&(-st));
val-=tree[st];
}
if(val!=0 || st>n)
return -1;
return st;
}
int m, v[NMAX], a, b,c;
int main()
{
fin>>n>>m;
for(int i=1;i<=n;++i)
{
fin>>v[i];
update(i,v[i]);
}
for(int i=1;i<=n;++i)
cout<<tree[i]<< " ";cout<<'\n';
for(int i=1;i<=m;++i)
{
fin>>c;
if(c==0)
{
fin>>a>>b;
update(a,b);
}
if(c==1)
{
fin>>a>>b;
fout<<query(b)-query(a-1)<<'\n';
}
if(c==2)
{
fin>>a;
fout<<bin(a)<<'\n';
}
}
return 0;
}