Cod sursa(job #222098)
using namespace std;
#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstdlib>
#include <utility>
#include <algorithm>
#include <functional>
#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define FORit(it,v) for(it = (v).begin();it != (v).end();++it)
#define mp make_pair
#define IN "aib.in"
#define OUT "aib.out"
#define N_MAX 1<<18
#define bit(x) ((x)&(x-1))^(x)
int N,M;
int A[N_MAX];
II void update(int x,int sum)
{
for(int i=x;i<=N;i += bit(i) )
A[i] += sum;
}
II int querry(int x)
{
int sum(0);
for(int i=x;i>=1;i -= bit(i) )
sum += A[i];
return sum;
}
II void scan()
{
int x;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d%d",&N,&M);
FOR(i,1,N)
{
scanf("%d",&x);
update(i,x);
}
}
II void solve()
{
int step,m,t,x,y;
FOR(i,1,M)
{
scanf("%d%d",&t,&x);
if(t==2)
{
for(step = 1;step <= N;step <<= 1);
for(m = 1;step;step >>= 1)
if(m + step <= N && querry(m+step-1) < x)
m += step;
printf("%d\n",querry(m)==x?m:-1);
}
else
{
scanf("%d",&y);
if(!t)
update(x,y);
else
printf("%d\n",querry(y) - querry(x-1) );
}
}
}
int main()
{
scan();
solve();
return 0;
}