Pagini recente » Cod sursa (job #147892) | Cod sursa (job #1559921) | Cod sursa (job #880768) | Cod sursa (job #130468) | Cod sursa (job #333528)
Cod sursa(job #333528)
#include<stdio.h>
#define DIM 100001
int n,aib[DIM];
int lsb (int x)
{
return x&(x-1)^x;
}
void add (int poz,int val)
{
for(;poz<=n;poz+=lsb(poz))
aib[poz]+=val;
}
int query (int poz)
{
int s=0;
for(;poz!=0;poz-=lsb(poz))
s+=aib[poz];
return s;
}
int cbin (int val)
{
int st=1,dr=n,nr,mij;
while(st<=dr)
{
mij=(st+dr)/2;
nr=query(mij);
if(val==nr)
return mij;
else if(nr<val)
st=mij+1;
else
dr=mij-1;
}
return -1;
}
int main ()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int i,m,nr,q,a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",&nr),add(i,nr);
for(i=1;i<=m;++i)
{
scanf("%d",&q);
switch (q)
{
case 0:scanf("%d%d",&a,&b),add(a,b);break;
case 1:scanf("%d%d",&a,&b),printf("%d\n",query(b)-query(a-1));break;
case 2:scanf("%d",&a),printf("%d\n",cbin(a));break;
}
}
return 0;
}