Nu aveti permisiuni pentru a descarca fisierul grader_test10.in

Cod sursa(job #1099076)

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

int n,m;
int V[NMAX];

void update(int ind,int val){

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

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

}

int Sum(int dr){

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

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

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;
        else{

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

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

int main(){

    int a,b,st,dr;
    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);
                switch(option){

                    case 0: scanf("%d%d",&a,&b);
                            update(a,b);
                            break;
                    case 1: scanf("%d%d",&st,&dr);
                            printf("%d\n",Sum(dr) - Sum(st-1));
                            break;
                    case 2: scanf("%d",&a);
                            printf("%d\n",Search(a));
                            break;
                };
--m;
        }

return 0;
}