Cod sursa(job #1231322)
Utilizator | Data | 20 septembrie 2014 12:02:38 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.44 kb |
#include<cstdio>
int n,m,i,j,q,aa,b,a[100100],s1,s2,p,u,mid,s;
FILE *f,*g;
int main(){
f=fopen("aib.in","r");
g=fopen("aib.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&q);
for(j=i;j<=n;j+=(j&-j)){
a[j]+=q;
}
}
for(i=1;i<=m;i++){
fscanf(f,"%d",&q);
if(q==0){
fscanf(f,"%d%d",&aa,&b);
for(j=aa;j<=n;j+=(j&-j)){
a[j]+=b;
}
}
else if(q==1){
fscanf(f,"%d%d",&aa,&b);
s1=s2=0;
for(j=b;j>0;j-=(j&-j)){
s1+=a[j];
}
for(j=aa-1;j>0;j-=(j&-j)){
s2+=a[j];
}
s1-=s2;
fprintf(g,"%d\n",s1);
}
else{
fscanf(f,"%d",&aa);
p=1;
u=n;
while(p<=u){
mid=(p+u)/2;
s=0;
for(j=mid;j>0;j-=(j&-j)){
s+=a[j];
}
if(aa<=s)
u=mid-1;
else
p=mid+1;
}
s=0;
for(j=p;j>0;j-=(j&-j)){
s+=a[j];
}
if(s==aa)
fprintf(g,"%d\n",p);
else
fprintf(g,"-1\n");
}
}
fclose(f);
fclose(g);
return 0;
}