#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
void updateInterv(std::vector<int>& tree, int node, int left, int right, int pos, int val)
{
if (left == right && left == pos) {
tree[node] += val;
} else {
int mid = (left + right) / 2;
if (pos <= mid) {
updateInterv(tree, 2*node, left, mid, pos, val);
} else {
updateInterv(tree, 2*node + 1, mid+1, right, pos, val);
}
tree[node] = tree[2*node] + tree[2*node+1];
}
}
int queryInterv(std::vector<int>& tree, int node, int left, int right, int a, int b)
{
if (a <= left && b >= right) {
return tree[node];
} else {
int mid = (left + right) / 2;
int leftSum = 0, rightSum = 0;
if (a <= mid) {
leftSum += queryInterv(tree, 2*node, left, mid, a, b);
}
if (b > mid) {
rightSum += queryInterv(tree, 2*node+1, mid+1, right, a, b);
}
return leftSum + rightSum;
}
return 0;
}
int binSearch(std::vector<int>& tree, int N, int a)
{
int left = 0, right = N;
while (right - left > 1) {
int mid = (left + right) / 2;
int valMid = queryInterv(tree, 1, 1, N, 1, mid);
if (valMid >= a) {
right = mid;
} else {
left = mid;
}
}
int valRight = queryInterv(tree, 1, 1, N, 1, right);
if (valRight == a) {
return right;
}
return -1;
}
int main ()
{
std::ifstream in("aib.in");
int N, M;
in >> N >> M;
std::vector<int> tree(N*ceilf(log(N)));
for (int i = 1; i <= N; ++ i) {
int x;
in >> x;
updateInterv(tree, 1, 1, N, i, x);
}
std::ofstream out("aib.out");
for (int i = 0; i < M; ++ i) {
char op;
int a, b;
in >> op;
if (op == '0') {
in >> a >> b;
updateInterv(tree, 1, 1, N, a, b);
} else if (op == '1') {
in >> a >> b;
out << queryInterv(tree, 1, 1, N, a, b) << "\n";
} else if (op == '2') {
in >> a;
out << binSearch(tree, N, a) << "\n";
}
}
in.close();
out.close();
return 0;
}