Cod sursa(job #2377788)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 11 martie 2019 09:34:13
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
#define NMAX 100009
#define zeros(x) ( (x ^ (x - 1)) & x )
#define in "aib.in"
#define out "aib.out"
using namespace std;
int arb[NMAX];
int N,M,i,val,test;
int x,y;
void adaug(int x, int quantity);
int cautbin(int x);
int sum(int x);
int main()
{ freopen(in,"r",stdin);
  freopen(out,"w",stdout);
  scanf("%d%d", &N, &M);
  for(i=1;i<=N;i++)
    {
       scanf("%d", &val);
       adaug(i,val);
    }
for(;M;M--)
    {
     scanf("%d",&test);
     if(test<2)
        {
         scanf("%d",&x,&y);
         if(!test) ///adaug
            adaug(x,y);
           else
            printf("%d\n",sum(y)-sum(x-1));
        }
        else ///caut binar pe sume valoarea
        {
          scanf("%d",&x);
          printf("%d\n",cautbin(x));
        }
    }
    return 0;
}
void adaug(int x, int quantity)
{
    int i;

    for (i = x; i <= N; i += zeros(i))
        arb[i] += quantity;
}

int sum(int x)
{
    int i, ret = 0;

    for (i = x; i > 0; i -= zeros(i))
        ret += arb[i];
    return ret;
}
int cautbin(int x)
{
 int poz=N+1,mj;
 int st=0,dr=N+1,suma;
 mj=N;
 suma=sum(mj);
 if(suma==x) poz=N;
 while(mj)
    {
     mj=(st+dr)/2;
     suma=sum(mj);
     if(x>suma)
        {if(dr>mj) dr=mj;mj--;}
      else
      {if(st<mj) st=mj;mj++;}
    if(mj<=st) break;
    if(mj>=dr) break;

    }
 if(poz==N+1) return -1;
 return poz;
}