Cod sursa(job #2222563)

Utilizator danielsociuSociu Daniel danielsociu Data 17 iulie 2018 12:33:04
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
std::ifstream cin("aib.in");
std::ofstream cout("aib.out");
#define maxn 100010

int arb[maxn];
int N,M,T;

void update(int,int);
int query(int);
int searchxd(int);

int main()
{
    int x,y;
    cin>>N>>M;
    for(int i=1;i<=N;i++){
        cin>>T;
        update(i,T);
    }
    while(M){
        M--;
        cin>>T;
        if(T<2){
            cin>>x>>y;
            if(T) cout<<query(y)-query(x-1)<<'\n';
            else update(x,y);
        }
        else{
            cin>>x;
            cout<<searchxd(x)<<'/n';
        }
    }
    return 0;
}

void update(int poz,int val){
    int C=0;
    while(poz<=N){
        arb[poz]+=val;
        while(!(poz&(1<<C))) C++;
        poz+=1<<C;
        C+=1;
    }
}

int query(int poz){
    int C=0,S=0;
    while(poz>0){
        S+=arb[poz];
        while(!(poz&(1<<C))) C++;
        poz-=1<<C;
        C+=1;
    }
    return S;
}

int searchxd(int val){
    int step,i=0;
    for(step=1;step<N;step<<=1);
    for(i=0;step;step>>=1){
        if(i+step<=N)
        {
            if(val>=arb[i+step])
            {
                i+=step,
                val-=arb[i];
                if(!val) return i;
            }
        }
    }
    return -1;
}