Cod sursa(job #174290)

Utilizator MciprianMMciprianM MciprianM Data 8 aprilie 2008 18:28:50
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<stdio.h>

freopen ("aib.in", "rt", stdin);
freopen ("aib.out", "wt", stdout);

int c[100001], n, m;
void modifica(int i, int x){
  int poz=0;
  while(i<=n){
    c[i]+=x;
    while((i&(1<<poz))==0)
      ++poz;
    i+=(1<<poz);
  }
}

int suma(int a, int b){
  if(a==1){
    int poz=0, s=0;
    while(b>0){
      s+=c[b];
      while((b&(1<<poz))==0)
	++poz;
      b-=(1<<poz);
    }
    return s;
  }
  else  return (suma(1,b)-suma(1,a-1));
}
int bs(int l, int r, int a){
  if(l>r) return -1;
  int m=(l+r)/2;
  int s=suma(1,m);
  if(s>a)  return bs(l,m-1,a);
  if(s<a)  return bs(m+1, r,a);
  if(s==a)  return m;
}

int fu(int a){
  int k;
  k=bs(1,n,a);
  return k;
}

void op(int i,int a, int b){
  switch(i){
    case 0:  modifica(a,b);break;
    case 1:  printf("%d\n",suma(a,b));break;
    case 2:  printf("%d\n",fu(a));break;
  }
}
int main(){
  int i, x, a, b;
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++){
    scanf("%d",&x);
    modifica(i,x);
  }
  for(i=0;i<m;i++){
    scanf("%d",&x);
    if(x==2){
      scanf("%d",&a);
      op(x,a,0);
    }
    else{
     scanf("%d%d", &a, &b);
      op(x,a,b);
    }
  }
  return 0;
}