Pagini recente » Cod sursa (job #1902188) | Cod sursa (job #576675) | Cod sursa (job #2864223) | Cod sursa (job #2508648) | Cod sursa (job #2819607)
#include <stdio.h>
#define MAXN 100000
int aib[MAXN+1];
int n, mp2;
int leastSignificantBit(int x){
return x&(-x);
}
void pow2(int n){
mp2=1;
while(mp2*2<=n){
mp2*=2;
}
}
void update(int pos,int val){
while(pos<=n){
aib[pos]+=val;
pos+=leastSignificantBit(pos);
}
}
int calcSum(int pos){
int sum=0;
while(pos>0){
sum+=aib[pos];
pos-=leastSignificantBit(pos);
}
return sum;
}
int Search(int value){
int pos,sum,step;
step=mp2;
pos=sum=0;
while(step){
if(pos+step<=n && sum+aib[pos+step]<=value){
sum+=aib[pos+step];
pos+=step;
}
step/=2;
}
if(pos==0 || sum!=value)
pos=-1;
return pos;
}
int main(){
FILE *fin,*fout;
int m,i,a,b,op;
fin=fopen("aib.in","r");
fout=fopen("aib.out","w");
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&a);
aib[i]+=a;
if(i+leastSignificantBit(i)<=n)
aib[i+leastSignificantBit(i)]+=aib[i];
}
pow2(n);
for(i=1;i<=m;i++){
fscanf(fin,"%d",&op);
if(op==0){
fscanf(fin,"%d%d",&a,&b);
update(a,b);
}else if(op==1){
fscanf(fin,"%d%d",&a,&b);
fprintf(fout,"%d\n",calcSum(b)-calcSum(a-1));
}else{
fscanf(fin,"%d",&a);
fprintf(fout,"%d\n",Search(a));
}
}
fclose(fin);
fclose(fout);
return 0;
}