Cod sursa(job #954858)
#include<cstdio>
#define lsb(x) ((x)&(-x))
int n,aib[100005];
void update(int p,int val)
{
for(;p<=n;p+=lsb(p))
aib[p]+=val;
}
int query(int p)
{
int ans=0;
for(;p;p-=lsb(p))
ans+=aib[p];
return ans;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int m,x,y,tip,PASMAX;
scanf("%d%d",&n,&m);
for(PASMAX=1;PASMAX<=n;PASMAX<<=1);PASMAX>>=1;
for(int i=1;i<=n;i++)
scanf("%d",&x),
update(i,x);
for(int i=1;i<=m;i++)
{
scanf("%d",&tip);
if(tip==0)
scanf("%d%d",&x,&y),
update(x,y);
else
if(tip==1)
scanf("%d%d",&x,&y),
printf("%d\n",query(y)-query(x-1));
else
{
scanf("%d",&x);
int ans=0;
for(int pas=PASMAX;pas;pas>>=1)
if(ans+pas<n && query(ans+pas)<x)
ans+=pas;
if(query(ans+1)==x)
printf("%d\n",ans+1);
else
printf("-1\n");
}
}
return 0;
}