#include <fstream>
#include <iostream>
#define MAXN 400000
using namespace std;
int v[MAXN], aint[4*MAXN];
int ans;
int minp2 ( int n ) {
int x = 1;
while( x < n )
x *= 2;
return x;
}
void init( int nod, int l, int r ) {
if( r == l )
aint[nod] = v[r];
else {
init( nod*2, l, (l+r)/2 );
init( nod*2+1, (l+r)/2+1, r );
aint[nod] = aint[nod*2] + aint[nod*2+1];
}
}
void update( int nod, int l, int r, int poz, int val ) {
if( l <= poz && poz <= r ) {
if( r == l )
aint[nod] = v[r];
else {
update( nod*2, l, (l+r)/2, poz, val );
update( nod*2+1, (l+r)/2+1, r, poz, val );
aint[nod] = aint[nod*2] + aint[nod*2+1];
}
}
}
void query( int nod, int l, int r, int lq, int rq ) {
if( lq <= l && rq >= r )
ans += aint[nod];
else if( rq < l || lq > r )
return;
else{
query( nod*2, l, (l+r)/2, lq, rq );
query( nod*2+1, (l+r)/2+1, r, lq, rq );
}
}
int cautbin( int nod, int l, int r, int val, int s ) {
if( l == r ) {
if( val == s + v[l] )
return l;
else
return -1;
}
int mid = (l + r) / 2;
if( s + aint[nod*2] >= val )
return cautbin( nod*2, l, mid, val, s );
s += aint[nod*2];
return cautbin( nod*2+1, mid+1, r, val, s);
}
int main() {
int m, n, i, a, b, t;
ifstream cin( "aib.in" );
ofstream cout( "aib.out" );
cin >> n >> m;
for( i = 0; i < n; i++ )
cin >> v[i];
//n = minp2( n );
init( 1, 0, n-1 );
for( i = 0; i < m; i++ ) {
cin >> t;
if( t == 0 ) {
cin >> a >> b;
v[a-1] += b;
update( 1, 0, n-1, a-1, b );
} else if( t == 1 ) {
cin >> a >> b;
ans = 0;
query( 1, 0, n-1, a-1, b-1 );
cout << ans;
} else {
cin >> a;
cout << cautbin( 1, 0, n-1, a, 0 ) + 1;
}
cout << "\n";
}
return 0;
}