Pagini recente » Cod sursa (job #324185) | Cod sursa (job #1227677) | Cod sursa (job #416204) | Cod sursa (job #2838105) | Cod sursa (job #419258)
Cod sursa(job #419258)
#include<stdio.h>
#define nmax 100011
int aib[nmax],n,m,x,op,a,b,i, n2;
void update(int poz, int val)
{
int pow=0;
while(poz<=n)
{
aib[poz]+=val;
for(;!(poz&1<<pow);pow++);
poz+=1<<pow;
pow++;
}
}
int query(int poz)
{
int pow=0, sum=0;
while(poz>0)
{
sum+=aib[poz];
for(;!(poz&1<<pow);pow++);
poz-=1<<pow;
pow++;
}
return sum;
}
int sum(int val)
{
int pow=n2,i=0;
for(;pow;pow>>=1)
if(i+pow<=n&&val>=aib[i+pow])
{
i+=pow;
val-=aib[i];
if(val==0)
return i;
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
int pow=1;
for(;pow<n;pow<<=1);
n2=pow;
for(i=1;i<=n;i++)
{
scanf("%d", &x);
update(i, x);
}
for(i=1;i<=m;i++)
{
scanf("%d", &op);
if(op==0)
{
scanf("%d %d", &a, &b);
update(a,b);
}
else if(op==1)
{
scanf("%d %d", &a, &b);
printf("%d\n", query(b)-query(a-1));
}
else
{
scanf("%d", &a);
printf("%d\n", sum(a));
}
}
return 0;
}