Pagini recente » Cod sursa (job #1134947) | Cod sursa (job #1115508) | Cod sursa (job #1156142) | Cod sursa (job #1333531) | Cod sursa (job #418367)
Cod sursa(job #418367)
#include <cstdio>
using namespace std;
#define f(x) (x^(x-1)&x)
#define nmax 150005
#define ll long long
ll A[nmax];
int n,m;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
void add(int in,int x)
{
for(int i=in;i<=n;i+=f(i))
A[i]+=x;
}
ll compute(int x)
{
ll s=0;
while(x)
{
s+=A[x];
x&=(x-1);
}
return s;
}
int query(int x)
{
int i=0,p=f(n);
while(p)
{
if(i+p<=n)
if(x>=A[i+p])
{
x-=A[i+p];
i+=p;
if(!x)
return i;
}
p>>=1;
}
return -1;
}
int main()
{
int i,ok,a,b;
ll x;
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(f,"%lld",&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);
/*if(a==b)
fprintf(g,"%d\n",A[a]);
else*/
fprintf(g,"%d\n",(compute(b)-compute(a-1)));
}
else
{
fscanf(f,"%d",&a);
fprintf(g,"%d\n",query(a));
}
}
return 0;
}