#include <fstream>
using namespace std;
ifstream in;
ofstream out;
int tree[400005];
int n, minim, m;
void build(int vert, int lf, int rg)
{
if (lf == rg)
{
in >> tree[vert];
}
else
{
int mid = (lf + rg) / 2;
build(vert * 2, lf, mid);
build(vert * 2 + 1, mid + 1, rg);
tree[vert] = tree[vert * 2] + tree[vert * 2 + 1];
}
}
void query(int vert, int lf, int rg, int a, int b)
{
if (a <= lf and rg <= b)
{
minim += tree[vert];
}
else
{
int mid = (lf + rg) / 2;
if (a <= mid)
query(2 * vert, lf, mid, a, b);
if (b > mid)
query(2 * vert + 1, mid + 1, rg, a, b);
}
}
void update(int vert, int lf, int rg, int a, int b)
{
if (lf == rg)
{
tree[vert] += b;
}
else
{
int mid = (lf + rg) / 2;
if (a <= mid)
update(2 * vert, lf, mid, a, b);
if (a > mid)
update(2 * vert + 1, mid + 1, rg, a, b);
tree[vert] = tree[vert * 2] + tree[vert * 2 + 1];
}
}
int bin_ser(int k, int a, int b)
{
int mid;
if (k > tree[1])
return -1;
while (a <= b)
{
mid = (a + b) / 2;
minim = 0;
query(1, 1, n, 1, mid);
if (minim == k)
return mid;
if (minim < k)
{
a = mid + 1;
}
else
b = mid - 1;
}
return -1;
}
int main()
{
in.open("aib.in");
out.open("aib.out");
in >> n >> m;
//build(1, 1, n);
for (int i = 1; i <= n; i++)
{
in >> minim;
update(1, 1, n, i, minim);
}
int p, a, b;
for (int i = 0; i < m; i++)
{
in >> p;
//out << p << a << b << endl;
if (p == 1)
{
in >> a >> b;
minim = 0;
query(1, 1, n, a, b);
out << minim << '\n';
}
else
{
if (p == 0)
{
in >> a >> b;
update(1, 1, n, a, b);
}
else
{
in >> a;
out << bin_ser(a, 1, n) << '\n';
}
}
}
out.close();
return 0;
}