Pagini recente » Cod sursa (job #1737053) | Cod sursa (job #2193956) | Cod sursa (job #142608) | Cod sursa (job #2952938) | Cod sursa (job #552129)
Cod sursa(job #552129)
#include <stdio.h>
#define maxn 100005
int aib[maxn];
int n;
void modifica(int , int);
int suma(int);
int cauta(int);
int main(void)
{ int i,k,a,b,m;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a), modifica(i,a);
for(; m; m--)
{ scanf("%d",&k);
if(k<2)
{ scanf("%d%d",&a,&b);
if(k==0) modifica(a,b);
else printf("%d\n",suma(b)-suma(a-1));
}
else
scanf("%d",&a), printf("%d\n",cauta(a));
}
return 0;
}
void modifica(int poz,int val)
{ int k=0;
while(poz<=n)
{ aib[poz]+=val;
while( !(poz & (1<<k)) ) k++;
poz+=(1<<k);
k++;
}
}
int suma(int poz)
{ int k=0,s=0;
while(poz>0)
{ s+=aib[poz];
while(!(poz & (1<<k))) k++;
poz-=(1<<k);
k++;
}
return s;
}
int cauta(int val)
{ int i,step;
for(step=1; step<=n; step<<=1);
for(i=0; step; step>>=1)
if(step+i<=n)
if(val>=aib[step+i])
{ i+=step; val-=aib[i];
if(val==0) return i;
}
return -1;
}