Cod sursa(job #3227377)

Utilizator Luijika_programatorulBursuc Luigi Luijika_programatorul Data 30 aprilie 2024 00:14:27
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include<bits/stdc++.h>
auto in = std::freopen("aib.in" , "r" , stdin);
auto out = std::freopen("aib.out" , "w" , stdout);
const int NMAX = 100005;
int aint[4 * NMAX];
int n,q,tip,a,b;
#define mid ((st + dr) / 2)
void build(int nod ,int st , int dr){
    if(st == dr){
        std::cin >> aint[nod];
        return;
    }
    build(2*nod,st,mid),build(2*nod+1,mid+1,dr);
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}
// dr L st dr Rst 
int query(int nod , int st ,int dr ,int L ,int R){
    if(L<=st && dr <= R){
        return aint[nod];
    }
    if(dr < L || R < st)return 0;
    return query(2*nod,st,mid,L,R) + query(2*nod+1,mid+1,dr,L,R);
}
void update(int nod , int st ,int dr ,int poz , int val){
    if(st == dr){
        aint[nod]+=val;
        return;
    }
    if(poz<=mid){
        update(2*nod,st,mid,poz,val);
    }else{
        update(2*nod+1,mid+1,dr,poz,val);
    }
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}
int bsearch(int nod ,int st ,int dr , int value){
    if(st == dr){
        return st;
    }
    if(aint[2*nod] < value){
        return bsearch(2*nod+1,mid+1,dr,value - aint[2 * nod]);
    }else{
        return bsearch(2 * nod , st, mid , value);
    }
}
int main(){
    std::cin >> n >> q;
    build(1,1,n);
    while(q--){
        std::cin >> tip >> a;
        if(tip == 0){
            std::cin >> b;
            update(1,1,n,a,b);
        }
        if(tip == 1){
            std::cin >> b;
            std::cout << query(1,1,n,a,b) << "\n";
        }
        if(tip ==  2){
            std::cout << bsearch(1,1,n,a) << "\n";
        }
    }
    return 0;
}