Pagini recente » Cod sursa (job #756444) | Cod sursa (job #290796) | Cod sursa (job #974309) | Cod sursa (job #1316634) | Cod sursa (job #954865)
Cod sursa(job #954865)
#include<stdio.h>
int n,m,i,aib[100010];
int lsb (int x)
{
return x&-x;
}
void update (int pos, int val)
{
for(int i=pos;i<=n;i+=lsb(i))
aib[i]+=val;
}
int query (int pos)
{
int ans=0;
while(pos)
{
ans+=aib[pos];
pos-=lsb(pos);
}
return ans;
}
int bs (int val)
{
int i,p,k,ans=0;
k=val;
for(p=0;;p++)
if((1<<p)>val)
{
p--;
break;
}
for(i=p-1;i>=0;i--)
if(ans+(1<<i)<=n)
if(aib[ans+(1<<i)]<val)
{
ans+=(1<<i);
val-=aib[ans];
}
ans++;
if(query(ans)==k) return ans;
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int tip,a,b,i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a);
update(i,a);
}
for(i=1;i<=m;i++)
{
scanf("%d",&tip);
if(tip==0)
{
scanf("%d%d",&a,&b);
update(a,b);
}
if(tip==1)
{
scanf("%d%d",&a,&b);
printf("%d\n",query(b)-query(a-1));
}
if(tip==2)
{
scanf("%d",&a);
printf("%d\n",bs(a));
}
}
return 0;
}