Cod sursa(job #2819607)

Utilizator albertaizicAizic Albert albertaizic Data 18 decembrie 2021 18:24:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>

#define MAXN 100000

int aib[MAXN+1];
int n, mp2;

int leastSignificantBit(int x){
  return x&(-x);
}
void pow2(int n){
  mp2=1;
  while(mp2*2<=n){
    mp2*=2;
  }
}
void update(int pos,int val){
  while(pos<=n){
    aib[pos]+=val;
    pos+=leastSignificantBit(pos);
  }
}

int calcSum(int pos){
  int sum=0;
  while(pos>0){
    sum+=aib[pos];
    pos-=leastSignificantBit(pos);
  }
  return sum;
}

int Search(int value){
  int pos,sum,step;
  step=mp2;
  pos=sum=0;
  while(step){
    if(pos+step<=n && sum+aib[pos+step]<=value){
      sum+=aib[pos+step];
      pos+=step;
    }
    step/=2;
  }
  if(pos==0 || sum!=value)
    pos=-1;
  return pos;
}

int main(){
  FILE *fin,*fout;
  int m,i,a,b,op;

  fin=fopen("aib.in","r");
  fout=fopen("aib.out","w");

  fscanf(fin,"%d%d",&n,&m);

  for(i=1;i<=n;i++){
    fscanf(fin,"%d",&a);
    aib[i]+=a;

    if(i+leastSignificantBit(i)<=n)
      aib[i+leastSignificantBit(i)]+=aib[i];
  }

  pow2(n);

  for(i=1;i<=m;i++){
    fscanf(fin,"%d",&op);

    if(op==0){
      fscanf(fin,"%d%d",&a,&b);
      update(a,b);

    }else if(op==1){
      fscanf(fin,"%d%d",&a,&b);
      fprintf(fout,"%d\n",calcSum(b)-calcSum(a-1));

    }else{
      fscanf(fin,"%d",&a);
      fprintf(fout,"%d\n",Search(a));

    }
  }

  fclose(fin);
  fclose(fout);
  return 0;
}