Cod sursa(job #2921672)

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

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

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;
}

void build(){
  for(int i=1;i<=n;i++){
    if(i+lb(i)<=n)
      aib[i+lb(i)]+=aib[i];
  }

}

int s(int val){
  int step,i,sum;
  i=1<<17;
  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)
    return step;
  return -1;
}

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",&aib[i]);
    }

    build();

    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;
}