#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
struct aib{
vector<int> vaib;
aib(int n)
:vaib(n+1)
{
}
void update(int node, int value, int n){
for(;node<=n;node+=node&(-node)){
vaib[node]+=value;
}
}
int query(int node, int n){
int ans=0;
for(;node>=1;node-=node&(-node)){
ans+=vaib[node];
}
return ans;
}
int cautare_binara(int value, int n){
int ans=0, sum_cur=0;
for(int step=(1<<30);step>0;step>>=1){
if(ans+step<n and sum_cur+vaib[ans+step]<value){
ans+=step;
sum_cur+=vaib[ans];
}
}
if(ans+1>n or query(ans+1, n)!=value){
return -1;
}
return ans+1;
}
};
int main(){
int n, q;
fin>>n>>q;
aib ans(n);
for(int i=1;i<=n;i++){
int val;
fin>>val;
ans.update(i, val, n);
}
for(int i=1;i<=q;i++){
int tip;
fin>>tip;
if(tip==0){
int node, val;
fin>>node>>val;
ans.update(node, val, n);
}else if(tip==1){
int a, b;
fin>>a>>b;
if(a>b){
swap(a,b);
}
fout<<abs(ans.query(a-1, n)-ans.query(b, n))<<'\n';
}else if(tip==2){
int value;
fin>>value;
fout<<ans.cautare_binara(value, n)<<'\n';
}
}
}