Cod sursa(job #2921679)

Utilizator albertaizicAizic Albert albertaizic Data 1 septembrie 2022 13:33:59
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX_N 100000
int aib[MAX_N+1];
int n,mp2;

inline int lb(int x){
  return x&-x;
}

void pow2(int n){
  mp2=1;
  while(mp2*2<=n){
    mp2*=2;
  }
}

void update(int x,int val){
  while(x<=n){
    aib[x]+=val;
    x+=lb(x);
  }
}

int query(int x){
  int rez;

  rez=0;
  while(x){
    rez+=aib[x];
    x-=lb(x);
  }
  return rez;
}

int s(int val){
  int step,i,sum;
  i=mp2;
  sum=step=0;
  while(i){
    if(i+step<=n && sum+aib[i+step]<=val){
      sum+=aib[i+step];
      step+=i;
    }
    i>>=1;
  }
  if(val!=sum || step==0)
    return -1;
  return step;
}

int main(){
    FILE *fin,*fout;
    int m,i,a,b,k;
    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+lb(i)<=n)
        aib[i+lb(i)]+=aib[i];
    }

    pow2(n);

    while(m--){
      fscanf(fin,"%d",&k);
      if(k==0){
        fscanf(fin,"%d%d",&a,&b);
        update(a,b);
      }else if(k==1){
        fscanf(fin,"%d%d",&a,&b);
        fprintf(fout,"%d\n",query(b)-query(a-1));
      }else if(k==2){
        fscanf(fin,"%d",&a);
        fprintf(fout,"%d\n",s(a));
      }
    }


    fclose(fout);
    return 0;
}