Pagini recente » Cod sursa (job #1609481) | Cod sursa (job #1711090) | Cod sursa (job #1362136) | Cod sursa (job #2740748) | Cod sursa (job #632306)
Cod sursa(job #632306)
#include<stdio.h>
FILE*f=fopen("aib.in","r");
FILE*g=fopen("aib.out","w");
int n,m,a,b,x,w[100001],v[100001];
int main() {
fscanf(f,"%d%d",&n,&m);
for(int i=1;i<=n;++i)
fscanf(f,"%d",&v[i]);
for(int i=1;i<=n;++i){
int y=(i^(i-1))&i;
for(int j=i-y+1;j<=i;++j)
w[i]+=v[j];
}
for(int i=1;i<=m;++i){
fscanf(f,"%d",&x);
if(!x){
fscanf(f,"%d%d",&a,&b);
while(a<=n){
w[a]+=b;
a+=(a^(a-1))&a;
}
}else if(x==1){
fscanf(f,"%d%d",&a,&b);
a--;
int x=0;
int y=0;
while(b){
x+=w[b];
b-=(b^(b-1))&b;
}
while(a){
y+=w[a];
a-=(a^(a-1))&a;
}
fprintf(g,"%d\n",x-y);
}else{
fscanf(f,"%d",&a);
b=1;
while(w[b]<a)
b*=2;
int aa=w[b/2];
int st=b/2;
int dr=b;
int mm;
while(st+2<=dr){
mm=(st+dr)/2;
if(aa+w[mm]<a){
aa+=w[mm];
st=mm;
}else if(aa+w[mm]>a)
dr=mm;
else
break;
}
if(st+2<=dr)
fprintf(g,"%d\n",mm);
else if(w[b]==a)
fprintf(g,"%d\n",b);
else
fprintf(g,"-1\n");
}
}
fclose(g);
fclose(f);
return 0;
}