Cod sursa(job #1099097)

Utilizator FayedStratulat Alexandru Fayed Data 5 februarie 2014 15:56:47
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#define NMAX 100001

int n,m;
int V[NMAX];

inline void update(int ind,int val){

    int poz = 0;
    while(ind <=n){

        V[ind]+=val;
            while(!(ind & (1<<poz)))
                ++poz;
        ind += (1<<poz);
        poz++;
    }

}

inline int Sum(int dr){

    int S = 0;
    int poz = 0;
    while(dr > 0){

        S+= V[dr];
        while(!(dr & (1<<poz)))
            poz++;
        dr = dr - (1<<poz);
      poz++;
    }
return S;
}

inline int Search(int x){

    int left = 1;
    int right = n;
    int m;

        while(left<=right){

        m = (left+right)/2;

        if(Sum(m) == x)
            return m;
        if(Sum(m) < x)
        left = m+1;
        else right = m-1;
        }
    return -1;
}

int main(){

    int a,b;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    int val;
    for(register int i=1;i<=n;++i){

        scanf("%d",&val);
        update(i,val);
    }

    int option;
        while(m){

               scanf("%d",&option);

                    if(option < 2){
                        scanf("%d%d",&a,&b);
                        if(!option)
                            update(a,b);
                         else printf("%d\n",Sum(b) - Sum(a-1));
                    }
                        else {scanf("%d",&a);
                            printf("%d\n",Search(a));
                        }
--m;
        }

return 0;
}