Cod sursa(job #3004935)

Utilizator AndPitAndreeaPiticar AndPit Data 16 martie 2023 18:10:44
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int v[100001],n;
int tree[100001];
int ask(int poz){
    int rez=0;
    while(poz){
        rez+=tree[poz];
        poz-=poz&(-poz);
    }
    return rez;
}
void add(int poz,int val){
    while(poz<=n){
        tree[poz]+=val;
        poz+=poz&(-poz);
    }
}
int query(int L,int R){
    if(L>R)
        return 0;
    else
        return ask(R)-ask(L-1);
}
int Search(int val){
    int i,k;
    for(k=1;k<n;k<<=1);
        for(i=0;k;k>>=1){
            if(i+k<=n){
                if(val>=tree[i+k]){
                    i+=k;
                    val-=tree[i];
                    if(!val)
                        return i;
                }
            }
    }
    return -1;
}
int main(){
    int m;
    f>>n>>m;
    for(int i=1;i<=n;++i){
        f>>v[i];
        add(i,v[i]);
    }
    int cer,a,b;
    while(m--){
        f>>cer>>a;
        if(cer==0){
            f>>b;
            v[a]+=b;
            add(a,b);
        }
        if(cer==1){
            f>>b;
            g<<query(a,b)<<'\n';
        }
        if(cer==2)
            g<<Search(a)<<'\n';
    }
    return 0;
}