Cod sursa(job #174302)

Utilizator MciprianMMciprianM MciprianM Data 8 aprilie 2008 18:47:28
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream.h>

//using namespace std;
  
int c[1001], n, m;
ofstream g("aib.out");   
void modifica(int i, int x){   
  while(i<=n){   
    c[i]+=x;   
    i+=(i&(~(i-1)));   
  }   
}   
  
int suma(int a, int b){   
  if(a==1){   
    int  s=0;
    while(b>0){   
      s+=c[b];   
      b-=(b&(~(b-1)));   
    }   
    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:  g<<suma(a,b)<<'\n';break;   
    case 2:  g<<fu(a)<<'\n';break;   
  }   
}   
int main(){   
  int i, x, a, b;   
  ifstream f("aib.in");   
  f>>n>>m;   
  for(i=1;i<=n;i++){   
    f>>x;   
    modifica(i,x);   
  }   
  for(i=0;i<m;i++){   
    f>>x;   
    if(x==2){   
      f>>a;   
      op(x,a,0);   
    }   
    else{   
      f>>a>>b;   
      op(x,a,b);   
    }   
  }   
  f.close();   
  g.close();   
  return 0;   
}