Cod sursa(job #1622378)

Utilizator avaspAva Spataru avasp Data 1 martie 2016 11:14:21
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>
using namespace std;
int n,m,x,a,b,v[100001],t;

void adauga(int val,int poz){
    v[poz]+=val;
    while((poz+(poz&(-poz)))<=n){
        poz+=poz&(-poz);
        v[poz]+=val;
    }
}

int sum(int poz1,int poz2){
    int s=0;
    //poz2
    s+=v[poz2];
    while(poz2&(poz2-1)){
        poz2=poz2&(poz2-1);
        s+=v[poz2];
    }
    //poz1
    poz1--;
    s-=v[poz1];
    while(poz1&(poz1-1)){
        poz1=poz1&(poz1-1);
        s-=v[poz1];
    }
    return s;
}

int bin(int val){
    int l1,l2,minim;
    l1=1;
    l2=n;
    minim=-1;
    while(l1<=l2){
        int mij=(l1+l2)/2;
        int s=sum(1,mij);
        if(s==val){
            minim=mij;
            l2=mij-1;
        }
        else
        if(s<val)
            l1=mij+1;
        else
        if(s>val)
            l2=mij-1;
    }
    return minim;
}


int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        adauga(x,i);
    }
    for(int i=1;i<=m;i++){
        scanf("%d",&t);
        if(t==0){
            scanf("%d%d",&a,&b);
            adauga(b,a);
        }
        else
        if(t==1){
            scanf("%d%d",&a,&b);
            printf("%d\n",sum(a,b));
        }
        else
        if(t==2){
            scanf("%d",&a);
            printf("%d\n",bin(a));
        }
    }
    return 0;
}