Cod sursa(job #201684)

Utilizator maria_pparcalabescu maria daniela maria_p Data 2 august 2008 21:08:15
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<cstdio>
long c[100100],a,b,s,n,m,x,i,op;
void modif(long poz, long val){
	long x=0;
	while(poz<=n){
		c[poz]+=val;
		while((poz & (1 << x)) ==0)
			x++;
		poz+=(1 << x);
		x++;
	}
}
long suma(long dr){
	long s=0,x=0;
	while(dr>0){
		s+=c[dr];
		while((dr & (1 << x))==0)
			x++;
		dr-=(1 << x);
		x++;
	}
	return s;
}
long pozitie(long suma){
	long p=1,q=0,s=0;
	if(suma==0)return -1;
	for(;p<n;p<<=1);
	for(;p;p>>=1){
		if(p+q<=n && s+c[p+q]<=suma){
			q+=p;
			s+=c[q];
		}
		if(s==suma)return q;
	}
	return -1;
}
int main(){
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=n;i++){
		scanf("%ld",&x);
		modif(i,x);
	}
	for(;m>0;m--){
		scanf("%ld",&op);
		if(op==0){
			scanf("%ld%ld",&a,&b);
			modif(a,b);
		}
		if(op==1){
			scanf("%ld%ld",&a,&b);
			s=suma(b)-suma(a-1);
			printf("%ld\n",s);
		}
		if(op==2){
			scanf("%ld",&a);
			x=pozitie(a);
			printf("%ld\n",x);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}