#include <bits/stdc++.h>
#define dim 100001
using namespace std ;
long long g[dim] , tree[4 * dim] , n ;
int q ;
int op ;
void build(int v , int tl , int tr){
if(tl == tr) tree[v] = g[tl] ;
else{
int tm = (tl + tr) / 2 ;
build(2 * v , tl , tm) ;
build(2 * v + 1 , tm + 1 , tr) ;
tree[v] = tree[2 * v] + tree[2 * v + 1] ;
}
}
void update(int v , int tl , int tr , int poz , int val){
if(tl == tr) tree[v] += val ;
else{
int tm = (tl + tr) / 2 ;
if(poz <= tm) update(2 * v , tl ,tm , poz , val) ;
else update(2 * v + 1 , tm + 1 , tr , poz , val) ;
tree[v] = tree[2 * v] + tree[2 * v + 1] ;
}
}
long long query(int v , int tl , int tr , int st , int dr){
if(tl > dr || tr < st) return 0 ;
if(tl >= st && tr <= dr) return tree[v] ;
int tm = (tl + tr) / 2 ;
return query(2 * v , tl , tm , st , dr) + query(2 * v + 1 , tm + 1 , tr , st , dr) ;
}
long long binary(int v , int tl , int tr , long long a){
if(tl == tr){
if(tree[v] == a) return tl ;
return -1 ;
}
int tm = (tl + tr) / 2 ;
if(tree[2 * v] >= a) return binary(2 * v , tl , tm , a) ;
else return binary(2 * v + 1 , tm + 1 , tr , a - tree[2 * v]) ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0) ;
cin >> n >> q ;
for(int i = 1 ; i <= n ; ++i) cin >> g[i] ;
build(1 , 1 , n) ;
while(q--){
cin >> op ;
if(op == 0){
int poz , val ;
cin >> poz >> val ;
update(1 , 1 , n , poz , val) ;
}
else if(op == 1){
int a , b ;
cin >> a >> b ;
cout << query(1 , 1 , n , a , b) << '\n' ;
}
else{
///op = 2 :
long long a ;
cin >> a ;
if(tree[1] < a) cout << -1 << '\n' ;
else cout << binary(1 , 1 , n , a) << '\n' ;
}
}
return 0 ;
}