#include <fstream>
using namespace std;
void update(int index, int val, int bit[], int N)
{
while (index <= N)
{
bit[index] += val;
index += index & -index;
}
}
int query(int index, int bit[], int N)
{
int sum = 0;
while (index > 0)
{
sum += bit[index];
index -= index & -index;
}
return sum;
}
int query(int a, int b, int bit[], int N)
{
return query(b, bit, N) - query(a - 1, bit, N);
}
int binarySearch(int left, int right, int val, int bit[], int N)
{
int middle;
while (right - left > 1)
{
middle = left + (right - left) / 2;
if (query(middle, bit, N) >= val)
right = middle;
else
left = middle;
}
if (right == N + 1 || query(right, bit, N) != val)
return -1;
return right;
}
int main()
{
int N, M, i, a, b, op;
ifstream f("aib.in");
f >> N >> M;
int bit[N + 1];
fill(bit, bit + N + 1, 0);
for (i = 1; i <= N; i++)
{
f >> a;
update(i, a, bit, N);
}
ofstream g("aib.out");
for (i = 1; i <= M; i++)
{
f >> op >> a;
if (op == 0)
{
f >> b;
update(a, b, bit, N);
}
else if (op == 1)
{
f >> b;
g << query(a, b, bit, N) << '\n';
}
else if (op == 2)
g << binarySearch(0, N + 1, a, bit, N) << '\n';
}
f.close();
g.close();
return 0;
}