#include <iostream>
#include <fstream>
#include <stdio.h>
#define MAXN 100000
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
struct tree
{
int nr;
tree *left,*right;
}*Tree;
int N,M;
int *Vector;
tree *CreateNewTree()
{
tree *q=new tree;
q->nr=0;
q->left=q->right=0;
return q;
}
int CreateTree(tree *q,int left,int right)
{
if(left==right)
{
q->nr=Vector[left];
return q->nr;
}
int m=(left+right)/2;
int nr1,nr2;
q->left=CreateNewTree();
nr1=CreateTree(q->left,left,m);
q->right=CreateNewTree();
nr2=CreateTree(q->right,m+1,right);
q->nr=nr1+nr2;
return q->nr;
}
void Update(tree *q,int left,int right,int a,int b)
{
if(left==right)
{
q->nr+=b;
return;
}
int m=(left+right)/2;
if(a<=m)
Update(q->left,left,m,a,b);
else
Update(q->right,m+1,right,a,b);
q->nr+=b;
}
void Read()
{
fin>>N>>M;
int i;
Vector=new int [N+5];
for(i=1;i<=N;i++)
{
fin>>Vector[i];
}
Tree=CreateNewTree();
CreateTree(Tree,1,N);
delete Vector;
}
int Query1(tree *q,int left,int right,int a,int b)
{
if(a<=left&&right<=b)
{
return q->nr;
}
int m=(left+right)/2;
int nr1=0,nr2=0;
if(a<=m)
nr1=Query1(q->left,left,m,a,b);
if(b>m)
nr2=Query1(q->right,m+1,right,a,b);
return nr1+nr2;
}
int Query2(tree *q,int left,int right,int a,int &s)
{
if(s+q->nr<=a)
{
s+=q->nr;
return right;
}
if(left==right)
{
s+=q->nr;
return -1;
}
int m=(left+right)/2;
int nr=-1;
nr=Query2(q->left,left,m,a,s);
if(s==a)
return nr;
// printf("%d %d %d\n",k,s,a);
if(s<a)
return Query2(q->right,m+1,right,a,s);
return -1;
}
int main()
{
Read();
int i,sw,a,b;
for(i=1;i<=M;i++)
{
fin>>sw;
if(sw==0)
{
fin>>a>>b;
Update(Tree,1,N,a,b);
}
else if(sw==1)
{
fin>>a>>b;
fout<<Query1(Tree,1,N,a,b)<<'\n';
}
else{
fin>>a;
b=0;
fout<<Query2(Tree,1,N,a,b)<<'\n';
}
}
fin.close();
fout.close();
return 0;
}