Cod sursa(job #2653200)

Utilizator anabatAna Batrineanu anabat Data 27 septembrie 2020 12:45:42
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 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;
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++){
    scanf("%d",&v[i]);
    update(i,v[i]);
  }
  for(i=1;i<=m;i++){
    scanf("%d",&q);
    if(q==0){
      scanf("%d%d",&a,&b);
      update(a,b); ///a=poz,b=val
    }
    else if(q==1){
      scanf("%d%d",&a,&b);
      if(a==1)
        printf("%d\n",query(b));
      else
        printf("%d\n",query(b)-query(a-1));
    }
    else{ ///cbin
      scanf("%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)
        printf("%d\n",st);
      else
        printf("-1\n");
    }
  }
  //fclose(fin);
  //fclose(fout);
  return 0;
}