Cod sursa(job #2653203)

Utilizator anabatAna Batrineanu anabat Data 27 septembrie 2020 12:48:26
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>

using namespace std;

#define NMAX 100000

int v[NMAX+1],aib[NMAX+1];

void update(int poz,int val){
  for(int i=poz;i<NMAX;i+=i&(-i))
    aib[i]+=val;
}

int query(int poz){ ///poz lui x din [1;x]
  int answer=0;
  for(int i=poz;i>0;i-=i&(-i))
    answer+=aib[i];
  return answer;
}

int main()
{
  FILE *fin,*fout;
  fin=fopen("aib.in","r");
  fout=fopen("aib.out","w");

  int n,m,i,q,a,b;
  fscanf(fin,"%d%d",&n,&m);
  for(i=1;i<=n;i++){
    fscanf(fin,"%d",&v[i]);
    update(i,v[i]);
  }
  for(i=1;i<=m;i++){
    fscanf(fin,"%d",&q);
    if(q==0){
      fscanf(fin,"%d%d",&a,&b);
      update(a,b); ///a=poz,b=val
    }
    else if(q==1){
      fscanf(fin,"%d%d",&a,&b);
      if(a==1)
        fprintf(fout,"%d\n",query(b));
      else
        fprintf(fout,"%d\n",query(b)-query(a-1));
    }
    else{ ///cbin
      fscanf(fin,"%d",&a);
      int st=1;
      int dr=n;
      while(st<dr){
        int mij=(st+dr)/2;
        if(query(mij)>=a)
          dr=mij;
        else
          st=mij+1;
      }
      if(query(st)==a)
        fprintf(fout,"%d\n",st);
      else
        fprintf(fout,"-1\n");
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}