#include <fstream>
using namespace std;
const int Nmax = 100005;
int v[Nmax], aint[4 * Nmax];
void build(int nod, int st, int dr){
if(st == dr){
aint[nod] = v[st];
return;
}
int mid = (st + dr) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
void update(int nod, int st, int dr, int a, int b){
if(st == dr && st == a){
aint[nod] += b;
return;
}
int mid = (st + dr) / 2;
if(a <= mid){
update(2 * nod, st, mid, a, b);
}
else{
update(2 * nod + 1, mid + 1, dr, a, b);
}
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
int query1(int nod, int st, int dr, int a, int b){
if(st == a && dr == b){
return aint[nod];
}
int mid = (st + dr) / 2;
if(b <= mid){
return query1(2 * nod, st, mid, a, b);
}
else if(mid < a){
return query1(2 * nod + 1, mid + 1, dr, a, b);
}
else{
return (query1(2 * nod, st, mid, a, mid) + query1(2 * nod + 1, mid + 1, dr, mid + 1, b));
}
}
int query2(int nod, int st, int dr, int a, int sum){
int mid = (st + dr) / 2;
if(st == dr){
return st;
}
if(sum + aint[2 * nod] == a){
return mid;
}
else if(a < aint[2 * nod]){
return query2(2 * nod, st, mid, a, sum);
}
else{
return query2(2 * nod + 1, mid + 1, dr, a, sum + aint[2 * nod]);
}
}
int main(){
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, type, a, b;
fin >> n >> m;
for(int i = 1; i <= n; i++){
fin >> v[i];
}
build(1, 1, n);
while(m--){
fin >> type;
if(type == 0){
fin >> a >> b;
v[a] += b;
update(1, 1, n, a, b);
}
else if(type == 1){
fin >> a >> b;
fout << query1(1, 1, n, a, b) << '\n';
}
else{
fin >> a;
fout << query2(1, 1, n, a, 0) << '\n';
}
}
return 0;
}