#include<stdio.h>
#define infile "aib.in"
#define outfile "aib.out"
#define nmax (400*1001)
int arb[nmax]; //aici vom salva arborele de intervale
int n; //numarul de elemente
int poz,val; //le vom volosi la adaugarea in arbore
int a,b; //interalul pe care se cauta suma la un query
void add(int rad, int st, int dr)
{
if(st==dr) { arb[rad]+=val; return; } //adaugam valoarea la pozitie
int mij=(st+dr)>>1;
arb[rad]=0;
if(poz<=mij && (rad<<1)<nmax) add(rad<<1,st,mij);
if(mij<poz && ((rad<<1)|1)<nmax) add((rad<<1)|1,mij+1,dr);
if((rad<<1)<nmax) arb[rad]+=arb[rad<<1];
if(((rad<<1)|1)<nmax) arb[rad]+=arb[(rad<<1)|1];
}
int query(int rad, int st, int dr)
{
if(a<=st && dr<=b) return arb[rad]; //suma
int mij=(st+dr)>>1;
int sum=0;
if(a<=mij && (rad<<1)<nmax) sum+=query(rad<<1,st,mij);
if(mij<b && ((rad<<1)|1)<nmax) sum+=query((rad<<1)|1,mij+1,dr);
return sum;
}
int cbin(int sum)
{
int st=1,dr=n,mij,val;
while(st<=dr)
{
mij=(st+dr)>>1;
a=1,b=mij; //intervalului query-ului
val=query(1,1,n); //valoarea query-ului
if(val==sum) return mij; //returnam pozitia
if(val>sum) dr=mij-1; //trebuie mai putin
else st=mij+1; //trebuie mai mult
}
return -1; //nu am gasit
}
int main()
{
int t,u;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
scanf("%d %d\n",&n,&t);
//citim sirul initial
for(poz=1;poz<=n;poz++)
{
scanf("%d",&val);
add(1,1,n);
}
//executam operatiile
while(t--)
{
scanf("%d ",&u); //tipul operatiei
if(!u)
{ //daca avem modificarea unei valori
scanf("%d %d\n",&poz,&val);
add(1,1,n);
}
else if(u==1)
{ //suma unui interval
scanf("%d %d\n",&a,&b);
printf("%d\n",query(1,1,n));
}
else if(u==2)
{ //pozitia pentru obtinerea sumei
scanf("%d\n",&val);
printf("%d\n",cbin(val));
}
}
fclose(stdin);
fclose(stdout);
return 0;
}