Pagini recente » Cod sursa (job #919107) | Cod sursa (job #589165) | Cod sursa (job #23180) | Cod sursa (job #1113723) | Cod sursa (job #2403518)
#include <bits/stdc++.h>
int aib[100001];
int get(int k){
int sum=0;
while(k!=0){
sum+=aib[k];
k=k&(k-1);
}
return sum;
}
int n;
void update(int k,int val){
while(k<=n){
aib[k]+=val;
k=k+(k&(-k));
}
}
int main()
{
int m,a,i,b,s,r,p,cer;
FILE*fi,*fo;
fi=fopen("aib.in","r");
fo=fopen("aib.out","w");
fscanf(fi,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(fi,"%d",&a);
update(i,a);
}
for(i=1;i<=m;i++){
fscanf(fi,"%d",&cer);
if(cer==0){
fscanf(fi,"%d%d",&a,&b);
update(a,b);
}
else if(cer==1){
fscanf(fi,"%d%d",&a,&b);
s=get(b)-get(a-1);
fprintf(fo,"%d\n",s);
}
else {
fscanf(fi,"%d",&a);
r=0;
p=1<<20;
while(p>0){
if(r+p<=n && get(r+p)<a){
r+=p;
}
p/=2;
}
if(get(r+1)==a)
fprintf(fo,"%d\n",r+1);
else fprintf(fo,"-1\n");
}
}
fclose(fi);
fclose(fo);
return 0;
}