Cod sursa(job #2574075)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 5 martie 2020 20:14:33
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include<bits/stdc++.h>
using namespace std;

const int NMAX=100005;
long long aib[NMAX],n;

void update(long long val, long long poz){
    for(long long i=poz;i<=n;i+=(-i)&i)
        aib[i]+=val;
}

long long query(long long poz){
    long long s=0;
    for(long long i=poz;i>=1;i-=(-i)&i)
        s+=aib[i];
    return s;
}

long long binSearch(long long val){
    long long st=1,dr=n;
    while(st<=dr){
        long long mij=(st+dr)/2;
        if(query(mij)==val)
            return mij;
        if(query(mij)>val)
            dr=mij-1;
        else
            st=mij+1;
    }
    return -1;
}

int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m;
    scanf("%d%d", &n, &m);
    for(int i=1;i<=n;i++){
        long long nr;
        scanf("%lld", &nr);
        update(nr, i);
    }
    for(int q=1;q<=m;q++){
        long long cer,nr;
        scanf("%lld%lld", &cer, &nr);
        if(cer==0){
            long long val;
            scanf("%lld", &val);
            update(val, nr);
        }
        else if(cer==1){
            long long nr2;
            scanf("%lld", &nr2);
            printf("%lld\n", query(nr2)-query(nr-1));
        }
        else
            printf("%lld\n", binSearch(nr));
    }
    return 0;
}