Pagini recente » Cod sursa (job #1931687) | Cod sursa (job #424684) | Cod sursa (job #320226) | Cod sursa (job #2097848) | Cod sursa (job #1535831)
#include <stdio.h>
#define lim 100000
#define LOG 16
int aib[lim+1],n;
void update(int poz,int val){
while(poz<=n){
aib[poz]+=val;
poz=poz+(poz&(-poz));
}
}
int query(int poz){
int s=0;
while(poz!=0){
s+=aib[poz];
poz=poz-(poz&(-poz));
}
return s;
}
int cautbin(int val){
int poz,pas;
poz=0;
pas=1<<LOG;
while(pas!=0){
if(poz+pas<=n&&aib[poz+pas]<=val){
poz+=pas;
val-=aib[poz];
}
pas/=2;
}
return poz;
}
int main(){
FILE *fin,*fout;
fin=fopen("aib.in","r");
fout=fopen("aib.out","w");
int m,i,val,poz,cer,s,l1,l2;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&val);
update(i,val);
}
for(i=1;i<=m;i++){
fscanf(fin,"%d",&cer);
if(cer==0){
fscanf(fin,"%d%d",&poz,&val);
update(poz,val);
}
if(cer==1){
fscanf(fin,"%d%d",&l1,&l2);
s=query(l2)-query(l1-1);
fprintf(fout,"%d\n",s);
}
if(cer==2){
fscanf(fin,"%d",&val);
poz=cautbin(val);
if(query(poz)!=val)
poz=-1;
fprintf(fout,"%d\n",poz);
}
}
fclose(fin);
fclose(fout);
return 0;
}