#include <iostream>
#include <fstream>
#define maxN 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, arb[4*maxN+66], SUM;
void Update();
void Query();
int Search();
void Update (int nod, int left, int right, int val, int poz) {
if (left == right) {
arb[nod] += val;
return;
}
int mid = (left+right)/2;
if (poz <= mid)
Update(2*nod, left, mid, val, poz);
else
Update(2*nod+1, mid+1, right, val, poz);
arb[nod] = arb[2*nod] + arb[2*nod+1];
}
void Query (int nod, int left, int right, int a, int b) {
if (a <= left and right <= b) {
SUM += arb[nod];
}
else {
int mid = (left+right)/2;
if (a <= mid)
Query(2*nod, left, mid, a, b);
if (b > mid)
Query(2*nod+1, mid+1, right, a, b);
}
}
int Search (int left, int right, int val) {
int mid = (left+right)/2;
if (left <= right) {
SUM = 0;
Query(1, 1, n, 1, mid);
if (val == SUM)
return mid;
if (val < SUM)
return Search(left, mid-1, val);
else
return Search(mid+1, right, val);
}
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
int val;
fin >> val;
Update(1, 1, n, val, i);
}
int Q;
for (int i = 1; i <= m; ++i) {
fin >> Q;
if (Q == 0) {
int a, b;
fin >> a >> b;
Update(1, 1, n, b, a);
}
if (Q == 1) {
int a, b;
fin >> a >> b;
SUM = 0;
Query(1, 1, n, a, b);
fout << SUM << '\n';
}
if (Q == 2) {
int a;
fin >> a;
fout << Search(1, n, a) << '\n';
}
}
}