#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
int AIB[4*nmax], V[nmax];
int n, m, act, x, y;
int sum=0;
void build(int i, int st, int dr)
{
if (st == dr) AIB[i] = V[st];
else
{
int mid = (st+dr)/2;
build(i*2, st, mid);
build(i*2+1, mid+1, dr);
AIB[i] = AIB[i*2] + AIB[i*2+1];
}
return;
}
void update(int i, int st, int dr, int poz, int val)
{
if (st == dr) AIB[i] +=val;
else
{
int mid = (st+dr)/2;
if (poz <= mid) update(i*2, st, mid, poz, val);
else update(i*2+1, mid+1, dr, poz, val);
AIB[i] = AIB[i*2] + AIB[i*2+1];
}
return;
}
void find(int i, int st, int dr, int a, int b)
{
if (a<=st && dr <=b) sum+=AIB[i];
else
{
int mid = (st+dr)/2;
if (a <= mid) find(i*2, st, mid, a, b);
if (b > mid) find(i*2+1, mid+1, dr, a, b);
}
return;
}
int bin_search(int a)
{
int st = 0 ;
int dr = n+1;
int mid;
while(dr - st > 1)
{
mid = (st+dr)/2;
sum =0;
find(1, 1, n, 1, mid); /// ---> sum
if (a <= sum)
{
dr = mid;
}else{
st = mid;
}
}
sum =0;
find(1, 1, n, 1, dr);
if (a==sum) return dr;
return -1;
}
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
f >> n >> m;
for(int i=1; i<=n; i++)
{
f >> V[i];
}
build(1, 1, n);
for(int i=1; i<=m; i++)
{
f >> act;
if (act == 0){
f >> x >> y;
update(1, 1, n, x, y);
}else
if (act == 1){
f >> x >> y;
sum =0;
find(1, 1, n, x, y);
g << sum << "\n";
}else{
f >> x;
g << bin_search(x) << "\n";
}
}
f.close();
g.close();
return 0;
}