Pagini recente » Cod sursa (job #284799) | Cod sursa (job #566498) | Cod sursa (job #2978032) | Cod sursa (job #398938) | Cod sursa (job #1773061)
#include <stdio.h>
int aib[100000],n;
void update(int p, int val){
while(p<=n){
aib[p]+=val;
p+=p&(-p);
}
}
int query(int p){
int s=0;
while(p!=0){
s+=aib[p];
p-=p&(-p);
}
return s;
}
int cautare_binara(int e){
int pas,i;
pas=1<<20;
i=0;
while(pas!=0){
if(i+pas<=n && aib[i+pas]<=e){
i+=pas;
e-=aib[i];
if(e==0)
return i;
}
pas/=2;
}
return -1;
}
int main(){
FILE *fin=fopen("aib.in","r");
FILE *fout=fopen("aib.out","w");
int m,i,e,t,a,b;
fscanf(fin,"%d%d",&n,&m);
for(i=1; i<=n; i++){
fscanf(fin,"%d",&e);
update(i,e);
}
for(i=1; i<=m; i++){
fscanf(fin,"%d%d",&t,&a);
if(t==0){
fscanf(fin,"%d",&b);
update(a,b);
}else if(t==1){
fscanf(fin,"%d",&b);
fprintf(fout,"%d\n", query(b)-query(a-1));
}else
fprintf(fout,"%d\n",cautare_binara(a));
}
fclose(fin);
fclose(fout);
return 0;
}