Pagini recente » Cod sursa (job #2758670) | Cod sursa (job #1192728) | Cod sursa (job #2254909) | Cod sursa (job #373890) | Cod sursa (job #2921679)
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX_N 100000
int aib[MAX_N+1];
int n,mp2;
inline int lb(int x){
return x&-x;
}
void pow2(int n){
mp2=1;
while(mp2*2<=n){
mp2*=2;
}
}
void update(int x,int val){
while(x<=n){
aib[x]+=val;
x+=lb(x);
}
}
int query(int x){
int rez;
rez=0;
while(x){
rez+=aib[x];
x-=lb(x);
}
return rez;
}
int s(int val){
int step,i,sum;
i=mp2;
sum=step=0;
while(i){
if(i+step<=n && sum+aib[i+step]<=val){
sum+=aib[i+step];
step+=i;
}
i>>=1;
}
if(val!=sum || step==0)
return -1;
return step;
}
int main(){
FILE *fin,*fout;
int m,i,a,b,k;
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+lb(i)<=n)
aib[i+lb(i)]+=aib[i];
}
pow2(n);
while(m--){
fscanf(fin,"%d",&k);
if(k==0){
fscanf(fin,"%d%d",&a,&b);
update(a,b);
}else if(k==1){
fscanf(fin,"%d%d",&a,&b);
fprintf(fout,"%d\n",query(b)-query(a-1));
}else if(k==2){
fscanf(fin,"%d",&a);
fprintf(fout,"%d\n",s(a));
}
}
fclose(fout);
return 0;
}