Pagini recente » Cod sursa (job #2046958) | Cod sursa (job #2514271) | Cod sursa (job #405116) | Cod sursa (job #353435) | Cod sursa (job #431003)
Cod sursa(job #431003)
#include <cstdio>
#define MAXN 100005
FILE* fin=fopen("aib.in","r");
FILE* fout=fopen("aib.out","w");
int c[MAXN],n,m;
void update(int ind,int val){
int poz=0;
while(ind<=n){
c[ind]+=val;
while(!(ind&(1<<poz))){
poz++;
}
ind+=(1<<poz);
poz++;
}
}
int query(int ind){
int s=0,poz=0;
while(ind>0){
s+=c[ind];
while(!(ind&(1<<poz))){
poz++;
}
ind-=(1<<poz);
poz++;
}
return s;
}
int search(int sum){
int pos=n+1,end=n+1,beg=0,mdl=n,s;
s=query(mdl);
if(s==sum){
pos=n;
}
while(mdl){
mdl=beg+((end-beg)>>1);
s=query(mdl);
if(s>sum){
if(end>mdl){
end=mdl;
}
mdl--;
}else if(s==sum){
pos=((pos<mdl)?pos:mdl);
end=mdl;
mdl--;
}else{
if(beg<mdl){
beg=mdl;
}
mdl++;
}
if(mdl<=beg)break;
if(mdl>=end)break;
}
return ((pos==n+1)?-1:pos);
}
int main(){
int op,a,b,d;
fscanf(fin,"%d %d",&n,&m);
for(int i=1;i<=n;i++){
fscanf(fin,"%d ",&d);
update(i,d);
}
for(int i=0;i<m;i++){
fscanf(fin,"%d %d",&op,&a);
switch(op){
case 0:
fscanf(fin,"%d ",&b);
update(a,b);
break;
case 1:
fscanf(fin,"%d ",&b);
fprintf(fout,"%d\n",query(b)-query(a-1));
break;
case 2:
fprintf(fout,"%d\n",search(a));
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}