#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int N = 1e5+10;
const int INF = 0;
int v[N];
int x[N*10];
int n, m;
int lef, rig;
int left(int i)
{
return 2*i + 1;
}
int right(int i)
{
return 2*i + 2;
}
int get(int node, int l, int r, int ll, int rr)
{
if(l >= ll && r <= rr)
{
return x[node];
}
if(r < ll || l > rr)
{
return INF;
}
int mid = (l + r) / 2;
return get(left(node), l, mid, ll, rr) + get(right(node), mid+1, r, ll, rr);
}
int update(int node, int l, int r, int poz, int val)
{
if(l == r && r == poz)
{
x[node] += val;
return x[node];
}
if(r < poz || l > poz)
{
return x[node];
}
int mid = (l + r) / 2;
int leftu = update(left(node), l, mid, poz, val);
int rightu = update(right(node), mid+1, r, poz, val);
x[node] = leftu + rightu;
return x[node];
}
int binget(int node, int l, int r, int k)
{
if(l > r)
return -2;
int mid = (l + r) / 2;
int midval = get(0, 0, n-1, 0, mid);
if(midval == k)
return mid;
else if(k < midval)
return binget(left(node) , l, mid-1, k);
else
return binget(right(node), mid+1, r, k);
}
void build(int node, int l, int r)
{
if(l == r)
{
x[node] = v[l];
return;
}
int mid = (l + r) / 2;
build(left(node), l, mid);
build(right(node), mid+1, r);
x[node] = x[left(node)] + x[right(node)];
}
int main()
{
fin >> n >> m;
for(int i = 0; i < n; ++i)
{
fin >> v[i];
}
build(0, 0, n-1);
for(int i = 0; i < m; ++i)
{
int typ;
fin >> typ;
if(typ == 0)
{
int poz, val;
fin >> poz >> val;
update(0, 0, n-1, poz-1, val);
}
else if(typ == 1)
{
int lef, rig;
fin >> lef >> rig;
fout << get(0, 0, n-1, lef-1, rig-1) << "\n";
}
else if(typ == 2)
{
int k;
fin >> k;
fout << binget(0, 0, n-1, k) + 1 << "\n";
}
}
return 0;
}