Cod sursa(job #174272)

Utilizator MciprianMMciprianM MciprianM Data 8 aprilie 2008 18:17:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>

using namespace std;

int c[100001], n, m;
ofstream g("aib.out");
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:  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;
}