Cod sursa(job #418485)
#include <cstdio>
#define nmax 100005
#define f(x) (x^(x-1)&x)
using namespace std;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
int A[nmax];
int n,m,u;
void add(int ind,int x)
{
for(int i=ind;i<=n;i+=f(i))
A[i]+=x;
}
int suma(int x)
{
int s=0;
while(x)
{
s+=A[x];
x&=(x-1);
}
return s;
}
int query(int x)
{
int p=u,i=0;
while(p)
{
if(i+p<=n)
if(x>=A[i+p])
{
x-=A[i+p];
i+=p;
if(!x)
return i;
}
p=p>>1;
}
return -1;
}
int main()
{
int i,ok,a,b,x;
fscanf(f,"%d %d",&n,&m);
for(u=1;u<n;u<<=1);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&x);
add(i,x);
}
for(i=1;i<=m;i++)
{
fscanf(f,"%d",&ok);
if(ok==0)
{
fscanf(f,"%d %d",&a,&b);
add(a,b);
}
else if(ok==1)
{
fscanf(f,"%d %d",&a,&b);
fprintf(g,"%d\n",(suma(b)-suma(a-1)));
}
else
{
fscanf(f,"%d",&a);
fprintf(g,"%d\n",query(a));
}
}
return 0;
}