Cod sursa(job #1654704)

Utilizator AdrianGotcaAdrian Gotca AdrianGotca Data 17 martie 2016 13:07:08
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>

using namespace std;

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

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

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

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

int cautbin(int st,int dr,int x){
    if (st>dr){
        return -1;
    }
    int mij=(st+dr)/2;
    int 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);
            }
        }
    }
}