Cod sursa(job #1654697)

Utilizator AdrianGotcaAdrian Gotca AdrianGotca Data 17 martie 2016 13:04:06
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>

using namespace std;

long long last2(long long);
void upd(long long,long long);
long long query(long long);
long long cautbin(long long,long long,long long);
long long n,m,aib[100005];
int main(){
    freopen("aib.in","r",stdin);
    scanf("%lld%lld",&n,&m);
    for (long long i=1;i<=n;i++){
        long long x;
        scanf("%lld",&x);
        upd(i,x);
    }
    for (long long i=1;i<=m;i++){
        long long x;
        scanf("%lld",&x);
        if (x<2){
            long long a,b;
            scanf("%lld%lld",&a,&b);
            if (x==0){
                upd(a,b);
            }
            else {
                long long s1=query(a-1);
                long long s2=query(b);
                printf("%lld\n",s2-s1);
            }
        }
        else {
            long long a;
            scanf("%lld",&a);
            printf("%lld\n",cautbin(1,n,a));
        }
    }
}

void upd(long long pos,long long val){
    for (long long i=pos;i<=n;i+=last2(i)){
        aib[i]+=val;
    }
}

long long query(long long x){
    long long ans=0;
    for (long long i=x;i>0;i-=last2(i)){
        ans+=aib[i];
    }
    return ans;
}

long long last2(long long x){
    return (x&(-x));
}

long long cautbin(long long st,long long dr,long long x){
    if (st>dr){
        return -1;
    }
    long long mij=(st+dr)/2;
    long long suma=query(mij);
    if (suma==x){
        return mij;
    }
    else {
        if (suma<x){
            return cautbin(mij+1,dr,x);
        }
        else {
            if (suma>x){
                return cautbin(st,mij-1,x);
            }
        }
    }
}