Cod sursa(job #389227)

Utilizator SzabiVajda Szabolcs Szabi Data 1 februarie 2010 12:27:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>
 int  n=0,m=0;
int  tree[100001];


  int read(int idx){
 int  sum=0;
while (idx>0){

sum+=tree[idx];
idx-=(idx & -idx);
}
return sum;

}

void update(int idx,int val){

	while(idx<=n){

tree[idx]+=val;
idx+= (idx & -idx);
	}

}

 int  elso(int a){
  int lo=1,hi=n,mid,temp;
  while (lo<=hi){
	mid=lo+(hi-lo)/2;
	temp=read(mid);
	if (temp==a){return mid;}
	else if (temp<a){lo=mid+1;}
	else {hi=mid-1;}


  }
return -1;
}

int main(void){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
tree[0]=0;
  int i=0,temp,a,b;

scanf("%d %d",&n,&m);

for(i=1;i<=n;i++){

scanf("%d",&temp);
update(i,temp);
}

for(i=1;i<=m;i++){
scanf("%d",&temp);

switch(temp){

case 0:
	scanf("%d %d",&a,&b);
	update(a,b);
	break;
case 1:
	scanf("%d %d",&a,&b);
	printf("%d\n",read(b)-read(a-1));

	break;
case 2:
scanf("%d",&a);
printf("%d\n",elso(a));
	break;

}

}
return 0;
}