Pagini recente » Cod sursa (job #1469862) | Cod sursa (job #2698998) | Cod sursa (job #430406) | Cod sursa (job #2046620) | Cod sursa (job #364612)
Cod sursa(job #364612)
#include <stdio.h>
#define Nmax 100002
int c[Nmax];
int n,m,i,a,b,op;
void add(int i,int a){
int z=0;
while( i<=n ){
c[i] += a;
while( !( i&(1 << z) ) ) z++;
i += (1<<z);
z++;
}
}
int query(int i){
int z=0,sum=0;
while( i>0 ){
sum += c[i];
while( !( i&(1 << z) ) ) z++;
i -= (1<<z);
z++;
}
return sum;
}
int search(int a){
int i,p;
for( p=1; p < n; ) p <<=1;
for(i=0; p; p >>=1 )
if( i+p <=n )
if(a >= c[i+p]){
i += p;
a -= c[i];
if( a == 0 ) return i;
}
return -1;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i){
scanf("%d",&a);
add(i,a);
}
for(i=1;i<=m;++i){
scanf("%d",&op);
if(op == 2){
scanf("%d",&a);
printf("%d\n",search(a));
}else{
scanf("%d%d",&a,&b);
if(op == 0) add(a,b);
else printf("%d\n",query(b)-query(a-1));
}
}
fclose(stdin); fclose(stdout);
return 0;
}