Cod sursa(job #2027165)

Utilizator cameleonGeorgescu Dan cameleon Data 25 septembrie 2017 18:32:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>

using namespace std;
#define Nmax 100005

int v,aib[Nmax],n,m;

int suma(int x){
    int s=0;
    while(x!=0){
        s+=aib[x];
        x=x&(x-1);
    }
    return s;
}

void adaug(int x,int v){
    do
    {
        aib[x]+=v;
        x+=x&(-x);
    }
    while(x<=n);
}

int poz(int x){

    int st=1,dr=n,mij,s,p=-1;;
    while(st<=dr){
        mij=(st+dr)/2;
        s=suma(mij);
        if(s==x){
            p=mij;
            dr=mij-1;
        }
        else
            if(s>x)
                dr=mij-1;
            else
                st=mij+1;
    }
    return p;
}
int main()
{
    int a,b,op;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d", &v);
        adaug(i,v);
    }

    for(int i=1;i<=m;i++){
        scanf("%d",&op);
        switch(op){
            case 0: {
                scanf("%d%d",&a,&b);
                adaug(a,b);
                break;
            }
            case 1:{
                scanf("%d%d",&a,&b);
                printf("%d\n",suma(b)-suma(a-1));
                break;
            }
            case 2:{
                scanf("%d",&a);
                printf("%d\n", poz(a));
            }
        }
    }
    return 0;
}